Sat Aug 3 03:21:42 UTC 2024 I: starting to build exchange-calendars/unstable/armhf on jenkins on '2024-08-03 03:21' Sat Aug 3 03:21:42 UTC 2024 I: The jenkins build log is/was available at https://jenkins.debian.net/userContent/reproducible/debian/build_service/armhf_3/8440/console.log Sat Aug 3 03:21:42 UTC 2024 I: Downloading source for unstable/exchange-calendars=4.5.5-2 --2024-08-03 03:21:42-- http://deb.debian.org/debian/pool/main/e/exchange-calendars/exchange-calendars_4.5.5-2.dsc Connecting to 46.16.76.132:3128... connected. Proxy request sent, awaiting response... 200 OK Length: 2476 (2.4K) [text/prs.lines.tag] Saving to: ‘exchange-calendars_4.5.5-2.dsc’ 0K .. 100% 309M=0s 2024-08-03 03:21:42 (309 MB/s) - ‘exchange-calendars_4.5.5-2.dsc’ saved [2476/2476] Sat Aug 3 03:21:42 UTC 2024 I: exchange-calendars_4.5.5-2.dsc -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 Format: 3.0 (quilt) Source: exchange-calendars Binary: python3-exchange-calendars Architecture: all Version: 4.5.5-2 Maintainer: Debian Python Team Uploaders: Edward Betts Homepage: https://github.com/gerrymanoim/exchange_calendars Standards-Version: 4.7.0 Vcs-Browser: https://salsa.debian.org/python-team/packages/exchange-calendars Vcs-Git: https://salsa.debian.org/python-team/packages/exchange-calendars.git Testsuite: autopkgtest Testsuite-Triggers: python3-all, python3-hypothesis, python3-pytest, tzdata-legacy Build-Depends: debhelper-compat (= 13), dh-sequence-python3, pybuild-plugin-pyproject, python3-all, python3-hypothesis , python3-korean-lunar-calendar , python3-numpy , python3-pandas , python3-pyluach , python3-pytest , python3-setuptools, python3-toolz , tzdata-legacy Package-List: python3-exchange-calendars deb python optional arch=all Checksums-Sha1: 8e5d426e28250bcc19a36be599af9ffa6e972c2b 3604547 exchange-calendars_4.5.5.orig.tar.gz 0fbf3d80872585a98ef30998693ba0d420312754 2956 exchange-calendars_4.5.5-2.debian.tar.xz Checksums-Sha256: c6e5dbb74360a75ca4d06d0043d9ae226c670cb68bc44b07ea0fec4d76bb32e9 3604547 exchange-calendars_4.5.5.orig.tar.gz 5c465ca6fb742b949dbae4a79f62fcf2a526ee5d6c2d53e8be3690a406d0a752 2956 exchange-calendars_4.5.5-2.debian.tar.xz Files: 1cee1a7005ef899be38f9dfeadf90bc6 3604547 exchange-calendars_4.5.5.orig.tar.gz 0ede03bbc50fa13644b2cc1183f9e48a 2956 exchange-calendars_4.5.5-2.debian.tar.xz -----BEGIN PGP SIGNATURE----- iQIzBAEBCgAdFiEE+4rPp4xyYInDitAmlgWhCYxjuSoFAmapir8ACgkQlgWhCYxj uSq0dg/+IjzpwQMEdumlersSO9xqG2PvjUfBG5zYfhfjCbYMbq7rPIpv3DnByXSV 1asAi8SjfFmRTl2vUcttc8Z15UOycsbNfLc5PYzJ4WvolI11moNYH4bR/OWAdV0K Co9lAwuLd/stTD0SVzex6atmgwUypV+hnTeD1UOzEQD/sy/Sp3+5DcfzBxunYYRA mFMuL+XEWKZKM1ZW11WPnF1yo+lxmpuTufeMkALgc/qnUNLybbjGMuQG2AsgMqWU RYB6Cay1IxVjk9MZL8UiXv543RYS2vbndMCXhVFb7w+d3iMNZuEParDoOmv1FpL8 l8RS5cDXzaoSKxXJ4NXJzEgXXILRjSqMi+NEape4AVe9UxM3i7RzEC/ChsUyWOx6 5nZEeSiXVtVz+/mCLXhCUp0aMQ0RkZhqJbtrYf1Cl81RMBJtEsDeC7AZE/d7eqqp pqYXClEcD5GG506updli6F3cyNjLMI8FZEJyOtUnmdn4SWEIxfO2QJEFSan0S3+0 YynQt0sYKgRZE+nDlSBrJqPgXLpXpy8NWUKQBUKgaXSQzmTFqmUbhwGb7MaUz3f5 R4uLY5PvMgqEh7JLQnWA/BSYfeTuu77wnzqy76VMdt1cpJomt1lfrWQ+y842lgQz BTVzH4qXa1YL10AweN9EW0qUJzyWudxIJozRKjKwWBXRbcAMYQk= =EDlL -----END PGP SIGNATURE----- Sat Aug 3 03:21:42 UTC 2024 I: Checking whether the package is not for us Sat Aug 3 03:21:42 UTC 2024 I: Starting 1st build on remote node ff4a-armhf-rb.debian.net. Sat Aug 3 03:21:42 UTC 2024 I: Preparing to do remote build '1' on ff4a-armhf-rb.debian.net. Sat Aug 3 05:23:08 UTC 2024 I: Deleting $TMPDIR on ff4a-armhf-rb.debian.net. I: pbuilder: network access will be disabled during build I: Current time: Fri Aug 2 15:21:49 -12 2024 I: pbuilder-time-stamp: 1722655309 I: Building the build Environment I: extracting base tarball [/var/cache/pbuilder/unstable-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 [exchange-calendars_4.5.5-2.dsc] I: copying [./exchange-calendars_4.5.5.orig.tar.gz] I: copying [./exchange-calendars_4.5.5-2.debian.tar.xz] I: Extracting source gpgv: Signature made Wed Jul 31 00:52:15 2024 gpgv: using RSA key FB8ACFA78C726089C38AD0269605A1098C63B92A gpgv: Can't check signature: No public key dpkg-source: warning: cannot verify inline signature for ./exchange-calendars_4.5.5-2.dsc: no acceptable signature found dpkg-source: info: extracting exchange-calendars in exchange-calendars-4.5.5 dpkg-source: info: unpacking exchange-calendars_4.5.5.orig.tar.gz dpkg-source: info: unpacking exchange-calendars_4.5.5-2.debian.tar.xz I: Not using root during the build. I: Installing the build-deps I: user script /srv/workspace/pbuilder/24692/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='unstable' HOME='/root' HOST_ARCH='armhf' IFS=' ' INVOCATION_ID='80cec52ae5f249dfb46821315519d67f' 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='24692' 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.paZm6Lvv/pbuilderrc_4Xz4 --distribution unstable --hookdir /etc/pbuilder/first-build-hooks --debbuildopts -b --basetgz /var/cache/pbuilder/unstable-reproducible-base.tgz --buildresult /srv/reproducible-results/rbuild-debian/r-b-build.paZm6Lvv/b1 --logfile b1/build.log exchange-calendars_4.5.5-2.dsc' SUDO_GID='113' SUDO_UID='107' 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 ff4a 6.1.0-23-armmp-lpae #1 SMP Debian 6.1.99-1 (2024-07-15) armv7l GNU/Linux I: ls -l /bin lrwxrwxrwx 1 root root 7 Aug 1 10:30 /bin -> usr/bin I: user script /srv/workspace/pbuilder/24692/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 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-sequence-python3, pybuild-plugin-pyproject, python3-all, python3-hypothesis, python3-korean-lunar-calendar, python3-numpy, python3-pandas, python3-pyluach, python3-pytest, python3-setuptools, python3-toolz, tzdata-legacy dpkg-deb: building package 'pbuilder-satisfydepends-dummy' in '/tmp/satisfydepends-aptitude/pbuilder-satisfydepends-dummy.deb'. Selecting previously unselected package pbuilder-satisfydepends-dummy. (Reading database ... 19507 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-sequence-python3; however: Package dh-sequence-python3 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-hypothesis; however: Package python3-hypothesis is not installed. pbuilder-satisfydepends-dummy depends on python3-korean-lunar-calendar; however: Package python3-korean-lunar-calendar is not installed. pbuilder-satisfydepends-dummy depends on python3-numpy; however: Package python3-numpy is not installed. pbuilder-satisfydepends-dummy depends on python3-pandas; however: Package python3-pandas is not installed. pbuilder-satisfydepends-dummy depends on python3-pyluach; however: Package python3-pyluach 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-toolz; however: Package python3-toolz is not installed. pbuilder-satisfydepends-dummy depends on tzdata-legacy; however: Package tzdata-legacy 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} debhelper{a} dh-autoreconf{a} dh-python{a} dh-strip-nondeterminism{a} dwz{a} file{a} gettext{a} gettext-base{a} groff-base{a} intltool-debian{a} libarchive-zip-perl{a} libblas3{a} libdebhelper-perl{a} libelf1t64{a} libexpat1{a} libfile-stripnondeterminism-perl{a} libgfortran5{a} libicu72{a} liblapack3{a} libmagic-mgc{a} libmagic1t64{a} libpipeline1{a} libpython3-stdlib{a} libpython3.12-minimal{a} libpython3.12-stdlib{a} libreadline8t64{a} libtool{a} libuchardet0{a} libxml2{a} m4{a} man-db{a} media-types{a} netbase{a} po-debconf{a} pybuild-plugin-pyproject{a} python3{a} python3-all{a} python3-attr{a} python3-build{a} python3-dateutil{a} python3-hypothesis{a} python3-iniconfig{a} python3-installer{a} python3-korean-lunar-calendar{a} python3-minimal{a} python3-numpy{a} python3-packaging{a} python3-pandas{a} python3-pandas-lib{a} python3-pkg-resources{a} python3-pluggy{a} python3-pyluach{a} python3-pyproject-hooks{a} python3-pytest{a} python3-setuptools{a} python3-six{a} python3-sortedcontainers{a} python3-toml{a} python3-toolz{a} python3-tz{a} python3-wheel{a} python3.12{a} python3.12-minimal{a} readline-common{a} sensible-utils{a} tzdata{a} tzdata-legacy{a} The following packages are RECOMMENDED but will NOT be installed: ca-certificates curl libarchive-cpio-perl libltdl-dev libmail-sendmail-perl lynx python3-bottleneck python3-bs4 python3-click python3-html5lib python3-jinja2 python3-lxml python3-matplotlib python3-numexpr python3-odf python3-openpyxl python3-pygments python3-scipy python3-tables wget 0 packages upgraded, 72 newly installed, 0 to remove and 0 not upgraded. Need to get 39.1 MB of archives. After unpacking 161 MB will be used. Writing extended state information... Get: 1 http://deb.debian.org/debian unstable/main armhf libpython3.12-minimal armhf 3.12.4-3 [798 kB] Get: 2 http://deb.debian.org/debian unstable/main armhf libexpat1 armhf 2.6.2-1 [83.5 kB] Get: 3 http://deb.debian.org/debian unstable/main armhf python3.12-minimal armhf 3.12.4-3 [1795 kB] Get: 4 http://deb.debian.org/debian unstable/main armhf python3-minimal armhf 3.12.4-1 [26.5 kB] Get: 5 http://deb.debian.org/debian unstable/main armhf media-types all 10.1.0 [26.9 kB] Get: 6 http://deb.debian.org/debian unstable/main armhf netbase all 6.4 [12.8 kB] Get: 7 http://deb.debian.org/debian unstable/main armhf tzdata all 2024a-4 [255 kB] Get: 8 http://deb.debian.org/debian unstable/main armhf readline-common all 8.2-4 [69.3 kB] Get: 9 http://deb.debian.org/debian unstable/main armhf libreadline8t64 armhf 8.2-4 [145 kB] Get: 10 http://deb.debian.org/debian unstable/main armhf libpython3.12-stdlib armhf 3.12.4-3 [1812 kB] Get: 11 http://deb.debian.org/debian unstable/main armhf python3.12 armhf 3.12.4-3 [664 kB] Get: 12 http://deb.debian.org/debian unstable/main armhf libpython3-stdlib armhf 3.12.4-1 [9500 B] Get: 13 http://deb.debian.org/debian unstable/main armhf python3 armhf 3.12.4-1 [27.6 kB] Get: 14 http://deb.debian.org/debian unstable/main armhf sensible-utils all 0.0.24 [24.8 kB] Get: 15 http://deb.debian.org/debian unstable/main armhf libmagic-mgc armhf 1:5.45-3 [314 kB] Get: 16 http://deb.debian.org/debian unstable/main armhf libmagic1t64 armhf 1:5.45-3 [98.1 kB] Get: 17 http://deb.debian.org/debian unstable/main armhf file armhf 1:5.45-3 [42.0 kB] Get: 18 http://deb.debian.org/debian unstable/main armhf gettext-base armhf 0.22.5-2 [195 kB] Get: 19 http://deb.debian.org/debian unstable/main armhf libuchardet0 armhf 0.0.8-1+b1 [65.7 kB] Get: 20 http://deb.debian.org/debian unstable/main armhf groff-base armhf 1.23.0-5 [1091 kB] Get: 21 http://deb.debian.org/debian unstable/main armhf bsdextrautils armhf 2.40.2-1 [87.8 kB] Get: 22 http://deb.debian.org/debian unstable/main armhf libpipeline1 armhf 1.5.7-2 [33.3 kB] Get: 23 http://deb.debian.org/debian unstable/main armhf man-db armhf 2.12.1-2 [1376 kB] Get: 24 http://deb.debian.org/debian unstable/main armhf m4 armhf 1.4.19-4 [264 kB] Get: 25 http://deb.debian.org/debian unstable/main armhf autoconf all 2.71-3 [332 kB] Get: 26 http://deb.debian.org/debian unstable/main armhf autotools-dev all 20220109.1 [51.6 kB] Get: 27 http://deb.debian.org/debian unstable/main armhf automake all 1:1.16.5-1.3 [823 kB] Get: 28 http://deb.debian.org/debian unstable/main armhf autopoint all 0.22.5-2 [723 kB] Get: 29 http://deb.debian.org/debian unstable/main armhf libdebhelper-perl all 13.16 [88.6 kB] Get: 30 http://deb.debian.org/debian unstable/main armhf libtool all 2.4.7-7 [517 kB] Get: 31 http://deb.debian.org/debian unstable/main armhf dh-autoreconf all 20 [17.1 kB] Get: 32 http://deb.debian.org/debian unstable/main armhf libarchive-zip-perl all 1.68-1 [104 kB] Get: 33 http://deb.debian.org/debian unstable/main armhf libfile-stripnondeterminism-perl all 1.14.0-1 [19.5 kB] Get: 34 http://deb.debian.org/debian unstable/main armhf dh-strip-nondeterminism all 1.14.0-1 [8448 B] Get: 35 http://deb.debian.org/debian unstable/main armhf libelf1t64 armhf 0.191-2 [183 kB] Get: 36 http://deb.debian.org/debian unstable/main armhf dwz armhf 0.15-1+b2 [106 kB] Get: 37 http://deb.debian.org/debian unstable/main armhf libicu72 armhf 72.1-5 [9075 kB] Get: 38 http://deb.debian.org/debian unstable/main armhf libxml2 armhf 2.12.7+dfsg-3+b1 [583 kB] Get: 39 http://deb.debian.org/debian unstable/main armhf gettext armhf 0.22.5-2 [1485 kB] Get: 40 http://deb.debian.org/debian unstable/main armhf intltool-debian all 0.35.0+20060710.6 [22.9 kB] Get: 41 http://deb.debian.org/debian unstable/main armhf po-debconf all 1.0.21+nmu1 [248 kB] Get: 42 http://deb.debian.org/debian unstable/main armhf debhelper all 13.16 [891 kB] Get: 43 http://deb.debian.org/debian unstable/main armhf python3-pkg-resources all 70.3.0-2 [264 kB] Get: 44 http://deb.debian.org/debian unstable/main armhf python3-setuptools all 70.3.0-2 [504 kB] Get: 45 http://deb.debian.org/debian unstable/main armhf dh-python all 6.20240603 [109 kB] Get: 46 http://deb.debian.org/debian unstable/main armhf libblas3 armhf 3.12.0-3 [108 kB] Get: 47 http://deb.debian.org/debian unstable/main armhf libgfortran5 armhf 14.2.0-1 [262 kB] Get: 48 http://deb.debian.org/debian unstable/main armhf liblapack3 armhf 3.12.0-3 [1803 kB] Get: 49 http://deb.debian.org/debian unstable/main armhf python3-packaging all 24.1-1 [45.8 kB] Get: 50 http://deb.debian.org/debian unstable/main armhf python3-pyproject-hooks all 1.1.0-2 [11.3 kB] Get: 51 http://deb.debian.org/debian unstable/main armhf python3-toml all 0.10.2-1 [16.2 kB] Get: 52 http://deb.debian.org/debian unstable/main armhf python3-wheel all 0.43.0-1 [52.5 kB] Get: 53 http://deb.debian.org/debian unstable/main armhf python3-build all 1.2.1-1 [34.1 kB] Get: 54 http://deb.debian.org/debian unstable/main armhf python3-installer all 0.7.0+dfsg1-3 [18.6 kB] Get: 55 http://deb.debian.org/debian unstable/main armhf pybuild-plugin-pyproject all 6.20240603 [11.2 kB] Get: 56 http://deb.debian.org/debian unstable/main armhf python3-all armhf 3.12.4-1 [1044 B] Get: 57 http://deb.debian.org/debian unstable/main armhf python3-attr all 23.2.0-2 [65.5 kB] Get: 58 http://deb.debian.org/debian unstable/main armhf python3-six all 1.16.0-7 [16.4 kB] Get: 59 http://deb.debian.org/debian unstable/main armhf python3-dateutil all 2.9.0-2 [79.4 kB] Get: 60 http://deb.debian.org/debian unstable/main armhf python3-sortedcontainers all 2.4.0-2 [31.9 kB] Get: 61 http://deb.debian.org/debian unstable/main armhf python3-hypothesis all 6.105.1-1 [317 kB] Get: 62 http://deb.debian.org/debian unstable/main armhf python3-iniconfig all 1.1.1-2 [6396 B] Get: 63 http://deb.debian.org/debian unstable/main armhf python3-korean-lunar-calendar all 0.3.1-2 [8584 B] Get: 64 http://deb.debian.org/debian unstable/main armhf python3-numpy armhf 1:1.26.4+ds-11 [3340 kB] Get: 65 http://deb.debian.org/debian unstable/main armhf python3-tz all 2024.1-2 [30.9 kB] Get: 66 http://deb.debian.org/debian unstable/main armhf python3-pandas-lib armhf 2.2.2+dfsg-4+b1 [3773 kB] Get: 67 http://deb.debian.org/debian unstable/main armhf python3-pandas all 2.2.2+dfsg-4 [3095 kB] Get: 68 http://deb.debian.org/debian unstable/main armhf python3-pluggy all 1.5.0-1 [26.9 kB] Get: 69 http://deb.debian.org/debian unstable/main armhf python3-pyluach all 2.2.0-1 [24.0 kB] Get: 70 http://deb.debian.org/debian unstable/main armhf python3-pytest all 8.3.2-1 [249 kB] Get: 71 http://deb.debian.org/debian unstable/main armhf python3-toolz all 0.12.1-1 [43.9 kB] Get: 72 http://deb.debian.org/debian unstable/main armhf tzdata-legacy all 2024a-4 [170 kB] Fetched 39.1 MB in 3s (13.4 MB/s) debconf: delaying package configuration, since apt-utils is not installed Selecting previously unselected package libpython3.12-minimal:armhf. (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 ... 19507 files and directories currently installed.) Preparing to unpack .../libpython3.12-minimal_3.12.4-3_armhf.deb ... Unpacking libpython3.12-minimal:armhf (3.12.4-3) ... Selecting previously unselected package libexpat1:armhf. Preparing to unpack .../libexpat1_2.6.2-1_armhf.deb ... Unpacking libexpat1:armhf (2.6.2-1) ... Selecting previously unselected package python3.12-minimal. Preparing to unpack .../python3.12-minimal_3.12.4-3_armhf.deb ... Unpacking python3.12-minimal (3.12.4-3) ... Setting up libpython3.12-minimal:armhf (3.12.4-3) ... Setting up libexpat1:armhf (2.6.2-1) ... Setting up python3.12-minimal (3.12.4-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 ... 19827 files and directories currently installed.) Preparing to unpack .../0-python3-minimal_3.12.4-1_armhf.deb ... Unpacking python3-minimal (3.12.4-1) ... Selecting previously unselected package media-types. Preparing to unpack .../1-media-types_10.1.0_all.deb ... Unpacking media-types (10.1.0) ... Selecting previously unselected package netbase. Preparing to unpack .../2-netbase_6.4_all.deb ... Unpacking netbase (6.4) ... Selecting previously unselected package tzdata. Preparing to unpack .../3-tzdata_2024a-4_all.deb ... Unpacking tzdata (2024a-4) ... Selecting previously unselected package readline-common. Preparing to unpack .../4-readline-common_8.2-4_all.deb ... Unpacking readline-common (8.2-4) ... Selecting previously unselected package libreadline8t64:armhf. Preparing to unpack .../5-libreadline8t64_8.2-4_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-4) ... Selecting previously unselected package libpython3.12-stdlib:armhf. Preparing to unpack .../6-libpython3.12-stdlib_3.12.4-3_armhf.deb ... Unpacking libpython3.12-stdlib:armhf (3.12.4-3) ... Selecting previously unselected package python3.12. Preparing to unpack .../7-python3.12_3.12.4-3_armhf.deb ... Unpacking python3.12 (3.12.4-3) ... Selecting previously unselected package libpython3-stdlib:armhf. Preparing to unpack .../8-libpython3-stdlib_3.12.4-1_armhf.deb ... Unpacking libpython3-stdlib:armhf (3.12.4-1) ... Setting up python3-minimal (3.12.4-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 ... 20829 files and directories currently installed.) Preparing to unpack .../00-python3_3.12.4-1_armhf.deb ... Unpacking python3 (3.12.4-1) ... Selecting previously unselected package sensible-utils. Preparing to unpack .../01-sensible-utils_0.0.24_all.deb ... Unpacking sensible-utils (0.0.24) ... Selecting previously unselected package libmagic-mgc. Preparing to unpack .../02-libmagic-mgc_1%3a5.45-3_armhf.deb ... Unpacking libmagic-mgc (1:5.45-3) ... Selecting previously unselected package libmagic1t64:armhf. Preparing to unpack .../03-libmagic1t64_1%3a5.45-3_armhf.deb ... Unpacking libmagic1t64:armhf (1:5.45-3) ... Selecting previously unselected package file. Preparing to unpack .../04-file_1%3a5.45-3_armhf.deb ... Unpacking file (1:5.45-3) ... Selecting previously unselected package gettext-base. Preparing to unpack .../05-gettext-base_0.22.5-2_armhf.deb ... Unpacking gettext-base (0.22.5-2) ... Selecting previously unselected package libuchardet0:armhf. Preparing to unpack .../06-libuchardet0_0.0.8-1+b1_armhf.deb ... Unpacking libuchardet0:armhf (0.0.8-1+b1) ... Selecting previously unselected package groff-base. Preparing to unpack .../07-groff-base_1.23.0-5_armhf.deb ... Unpacking groff-base (1.23.0-5) ... Selecting previously unselected package bsdextrautils. Preparing to unpack .../08-bsdextrautils_2.40.2-1_armhf.deb ... Unpacking bsdextrautils (2.40.2-1) ... Selecting previously unselected package libpipeline1:armhf. Preparing to unpack .../09-libpipeline1_1.5.7-2_armhf.deb ... Unpacking libpipeline1:armhf (1.5.7-2) ... Selecting previously unselected package man-db. Preparing to unpack .../10-man-db_2.12.1-2_armhf.deb ... Unpacking man-db (2.12.1-2) ... Selecting previously unselected package m4. Preparing to unpack .../11-m4_1.4.19-4_armhf.deb ... Unpacking m4 (1.4.19-4) ... Selecting previously unselected package autoconf. Preparing to unpack .../12-autoconf_2.71-3_all.deb ... Unpacking autoconf (2.71-3) ... Selecting previously unselected package autotools-dev. Preparing to unpack .../13-autotools-dev_20220109.1_all.deb ... Unpacking autotools-dev (20220109.1) ... Selecting previously unselected package automake. Preparing to unpack .../14-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 .../15-autopoint_0.22.5-2_all.deb ... Unpacking autopoint (0.22.5-2) ... Selecting previously unselected package libdebhelper-perl. Preparing to unpack .../16-libdebhelper-perl_13.16_all.deb ... Unpacking libdebhelper-perl (13.16) ... Selecting previously unselected package libtool. Preparing to unpack .../17-libtool_2.4.7-7_all.deb ... Unpacking libtool (2.4.7-7) ... Selecting previously unselected package dh-autoreconf. Preparing to unpack .../18-dh-autoreconf_20_all.deb ... Unpacking dh-autoreconf (20) ... Selecting previously unselected package libarchive-zip-perl. Preparing to unpack .../19-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 .../20-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 .../21-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 .../22-libelf1t64_0.191-2_armhf.deb ... Unpacking libelf1t64:armhf (0.191-2) ... Selecting previously unselected package dwz. Preparing to unpack .../23-dwz_0.15-1+b2_armhf.deb ... Unpacking dwz (0.15-1+b2) ... Selecting previously unselected package libicu72:armhf. Preparing to unpack .../24-libicu72_72.1-5_armhf.deb ... Unpacking libicu72:armhf (72.1-5) ... Selecting previously unselected package libxml2:armhf. Preparing to unpack .../25-libxml2_2.12.7+dfsg-3+b1_armhf.deb ... Unpacking libxml2:armhf (2.12.7+dfsg-3+b1) ... Selecting previously unselected package gettext. Preparing to unpack .../26-gettext_0.22.5-2_armhf.deb ... Unpacking gettext (0.22.5-2) ... Selecting previously unselected package intltool-debian. Preparing to unpack .../27-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 .../28-po-debconf_1.0.21+nmu1_all.deb ... Unpacking po-debconf (1.0.21+nmu1) ... Selecting previously unselected package debhelper. Preparing to unpack .../29-debhelper_13.16_all.deb ... Unpacking debhelper (13.16) ... Selecting previously unselected package python3-pkg-resources. Preparing to unpack .../30-python3-pkg-resources_70.3.0-2_all.deb ... Unpacking python3-pkg-resources (70.3.0-2) ... Selecting previously unselected package python3-setuptools. Preparing to unpack .../31-python3-setuptools_70.3.0-2_all.deb ... Unpacking python3-setuptools (70.3.0-2) ... Selecting previously unselected package dh-python. Preparing to unpack .../32-dh-python_6.20240603_all.deb ... Unpacking dh-python (6.20240603) ... Selecting previously unselected package libblas3:armhf. Preparing to unpack .../33-libblas3_3.12.0-3_armhf.deb ... Unpacking libblas3:armhf (3.12.0-3) ... Selecting previously unselected package libgfortran5:armhf. Preparing to unpack .../34-libgfortran5_14.2.0-1_armhf.deb ... Unpacking libgfortran5:armhf (14.2.0-1) ... Selecting previously unselected package liblapack3:armhf. Preparing to unpack .../35-liblapack3_3.12.0-3_armhf.deb ... Unpacking liblapack3:armhf (3.12.0-3) ... Selecting previously unselected package python3-packaging. Preparing to unpack .../36-python3-packaging_24.1-1_all.deb ... Unpacking python3-packaging (24.1-1) ... Selecting previously unselected package python3-pyproject-hooks. Preparing to unpack .../37-python3-pyproject-hooks_1.1.0-2_all.deb ... Unpacking python3-pyproject-hooks (1.1.0-2) ... Selecting previously unselected package python3-toml. Preparing to unpack .../38-python3-toml_0.10.2-1_all.deb ... Unpacking python3-toml (0.10.2-1) ... Selecting previously unselected package python3-wheel. Preparing to unpack .../39-python3-wheel_0.43.0-1_all.deb ... Unpacking python3-wheel (0.43.0-1) ... Selecting previously unselected package python3-build. Preparing to unpack .../40-python3-build_1.2.1-1_all.deb ... Unpacking python3-build (1.2.1-1) ... Selecting previously unselected package python3-installer. Preparing to unpack .../41-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 .../42-pybuild-plugin-pyproject_6.20240603_all.deb ... Unpacking pybuild-plugin-pyproject (6.20240603) ... Selecting previously unselected package python3-all. Preparing to unpack .../43-python3-all_3.12.4-1_armhf.deb ... Unpacking python3-all (3.12.4-1) ... Selecting previously unselected package python3-attr. Preparing to unpack .../44-python3-attr_23.2.0-2_all.deb ... Unpacking python3-attr (23.2.0-2) ... Selecting previously unselected package python3-six. Preparing to unpack .../45-python3-six_1.16.0-7_all.deb ... Unpacking python3-six (1.16.0-7) ... Selecting previously unselected package python3-dateutil. Preparing to unpack .../46-python3-dateutil_2.9.0-2_all.deb ... Unpacking python3-dateutil (2.9.0-2) ... Selecting previously unselected package python3-sortedcontainers. Preparing to unpack .../47-python3-sortedcontainers_2.4.0-2_all.deb ... Unpacking python3-sortedcontainers (2.4.0-2) ... Selecting previously unselected package python3-hypothesis. Preparing to unpack .../48-python3-hypothesis_6.105.1-1_all.deb ... Unpacking python3-hypothesis (6.105.1-1) ... Selecting previously unselected package python3-iniconfig. Preparing to unpack .../49-python3-iniconfig_1.1.1-2_all.deb ... Unpacking python3-iniconfig (1.1.1-2) ... Selecting previously unselected package python3-korean-lunar-calendar. Preparing to unpack .../50-python3-korean-lunar-calendar_0.3.1-2_all.deb ... Unpacking python3-korean-lunar-calendar (0.3.1-2) ... Selecting previously unselected package python3-numpy. Preparing to unpack .../51-python3-numpy_1%3a1.26.4+ds-11_armhf.deb ... Unpacking python3-numpy (1:1.26.4+ds-11) ... Selecting previously unselected package python3-tz. Preparing to unpack .../52-python3-tz_2024.1-2_all.deb ... Unpacking python3-tz (2024.1-2) ... Selecting previously unselected package python3-pandas-lib:armhf. Preparing to unpack .../53-python3-pandas-lib_2.2.2+dfsg-4+b1_armhf.deb ... Unpacking python3-pandas-lib:armhf (2.2.2+dfsg-4+b1) ... Selecting previously unselected package python3-pandas. Preparing to unpack .../54-python3-pandas_2.2.2+dfsg-4_all.deb ... Unpacking python3-pandas (2.2.2+dfsg-4) ... Selecting previously unselected package python3-pluggy. Preparing to unpack .../55-python3-pluggy_1.5.0-1_all.deb ... Unpacking python3-pluggy (1.5.0-1) ... Selecting previously unselected package python3-pyluach. Preparing to unpack .../56-python3-pyluach_2.2.0-1_all.deb ... Unpacking python3-pyluach (2.2.0-1) ... Selecting previously unselected package python3-pytest. Preparing to unpack .../57-python3-pytest_8.3.2-1_all.deb ... Unpacking python3-pytest (8.3.2-1) ... Selecting previously unselected package python3-toolz. Preparing to unpack .../58-python3-toolz_0.12.1-1_all.deb ... Unpacking python3-toolz (0.12.1-1) ... Selecting previously unselected package tzdata-legacy. Preparing to unpack .../59-tzdata-legacy_2024a-4_all.deb ... Unpacking tzdata-legacy (2024a-4) ... Setting up media-types (10.1.0) ... Setting up libpipeline1:armhf (1.5.7-2) ... Setting up libicu72:armhf (72.1-5) ... Setting up bsdextrautils (2.40.2-1) ... Setting up libmagic-mgc (1:5.45-3) ... Setting up libarchive-zip-perl (1.68-1) ... Setting up libdebhelper-perl (13.16) ... Setting up libmagic1t64:armhf (1:5.45-3) ... Setting up gettext-base (0.22.5-2) ... Setting up m4 (1.4.19-4) ... Setting up file (1:5.45-3) ... Setting up libelf1t64:armhf (0.191-2) ... Setting up tzdata (2024a-4) ... Current default time zone: 'Etc/UTC' Local time is now: Sat Aug 3 03:22:55 UTC 2024. Universal Time is now: Sat Aug 3 03:22:55 UTC 2024. Run 'dpkg-reconfigure tzdata' if you wish to change it. Setting up autotools-dev (20220109.1) ... Setting up libblas3:armhf (3.12.0-3) ... update-alternatives: using /usr/lib/arm-linux-gnueabihf/blas/libblas.so.3 to provide /usr/lib/arm-linux-gnueabihf/libblas.so.3 (libblas.so.3-arm-linux-gnueabihf) in auto mode Setting up autopoint (0.22.5-2) ... Setting up libgfortran5:armhf (14.2.0-1) ... Setting up autoconf (2.71-3) ... Setting up dwz (0.15-1+b2) ... Setting up sensible-utils (0.0.24) ... Setting up libuchardet0:armhf (0.0.8-1+b1) ... Setting up netbase (6.4) ... Setting up readline-common (8.2-4) ... Setting up libxml2:armhf (2.12.7+dfsg-3+b1) ... 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 liblapack3:armhf (3.12.0-3) ... update-alternatives: using /usr/lib/arm-linux-gnueabihf/lapack/liblapack.so.3 to provide /usr/lib/arm-linux-gnueabihf/liblapack.so.3 (liblapack.so.3-arm-linux-gnueabihf) in auto mode Setting up gettext (0.22.5-2) ... Setting up libtool (2.4.7-7) ... Setting up tzdata-legacy (2024a-4) ... Setting up intltool-debian (0.35.0+20060710.6) ... Setting up dh-autoreconf (20) ... Setting up libreadline8t64:armhf (8.2-4) ... Setting up dh-strip-nondeterminism (1.14.0-1) ... Setting up groff-base (1.23.0-5) ... Setting up libpython3.12-stdlib:armhf (3.12.4-3) ... Setting up po-debconf (1.0.21+nmu1) ... Setting up python3.12 (3.12.4-3) ... Setting up man-db (2.12.1-2) ... Not building database; man-db/auto-update is not 'true'. Setting up libpython3-stdlib:armhf (3.12.4-1) ... Setting up debhelper (13.16) ... Setting up python3 (3.12.4-1) ... Setting up python3-sortedcontainers (2.4.0-2) ... Setting up python3-wheel (0.43.0-1) ... Setting up python3-tz (2024.1-2) ... Setting up python3-six (1.16.0-7) ... Setting up python3-korean-lunar-calendar (0.3.1-2) ... Setting up python3-packaging (24.1-1) ... Setting up python3-pyproject-hooks (1.1.0-2) ... Setting up python3-toml (0.10.2-1) ... Setting up python3-installer (0.7.0+dfsg1-3) ... Setting up python3-pluggy (1.5.0-1) ... Setting up python3-toolz (0.12.1-1) ... Setting up python3-dateutil (2.9.0-2) ... Setting up python3-build (1.2.1-1) ... Setting up python3-pkg-resources (70.3.0-2) ... Setting up python3-iniconfig (1.1.1-2) ... Setting up python3-attr (23.2.0-2) ... Setting up python3-pyluach (2.2.0-1) ... Setting up python3-setuptools (70.3.0-2) ... Setting up python3-pytest (8.3.2-1) ... Setting up python3-hypothesis (6.105.1-1) ... Setting up python3-all (3.12.4-1) ... Setting up python3-numpy (1:1.26.4+ds-11) ... Setting up dh-python (6.20240603) ... Setting up pybuild-plugin-pyproject (6.20240603) ... Setting up python3-pandas-lib:armhf (2.2.2+dfsg-4+b1) ... Setting up python3-pandas (2.2.2+dfsg-4) ... Processing triggers for libc-bin (2.39-6) ... 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/exchange-calendars-4.5.5/ && 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 > ../exchange-calendars_4.5.5-2_source.changes dpkg-buildpackage: info: source package exchange-calendars dpkg-buildpackage: info: source version 4.5.5-2 dpkg-buildpackage: info: source distribution unstable dpkg-buildpackage: info: source changed by Edward Betts dpkg-source --before-build . dpkg-buildpackage: info: host architecture armhf debian/rules clean dh clean --buildsystem=pybuild debian/rules override_dh_auto_clean make[1]: Entering directory '/build/reproducible-path/exchange-calendars-4.5.5' dh_auto_clean rm -rf exchange_calendars.egg-info/ exchange_calendars/_version.py make[1]: Leaving directory '/build/reproducible-path/exchange-calendars-4.5.5' dh_autoreconf_clean -O--buildsystem=pybuild dh_clean -O--buildsystem=pybuild debian/rules binary dh binary --buildsystem=pybuild 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/exchange-calendars-4.5.5/.pybuild/cpython3_3.12_exchange-calendars * Building wheel... running bdist_wheel running build running build_py creating build creating build/lib creating build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xmil.py -> build/lib/exchange_calendars copying exchange_calendars/calendar_helpers.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xsgo.py -> build/lib/exchange_calendars copying exchange_calendars/lunisolar_holidays.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xswx.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_iepa.py -> build/lib/exchange_calendars copying exchange_calendars/tase_holidays.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xfra.py -> build/lib/exchange_calendars copying exchange_calendars/xbkk_holidays.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xidx.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xhkg.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xasx.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xses.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xtse.py -> build/lib/exchange_calendars copying exchange_calendars/xkrx_holidays.py -> build/lib/exchange_calendars copying exchange_calendars/always_open.py -> build/lib/exchange_calendars copying exchange_calendars/errors.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xhel.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xwbo.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xkls.py -> build/lib/exchange_calendars copying exchange_calendars/precomputed_exchange_calendar.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xdub.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_asex.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xnys.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xtae.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xbue.py -> build/lib/exchange_calendars copying exchange_calendars/us_holidays.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_aixk.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xbog.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xnze.py -> build/lib/exchange_calendars copying exchange_calendars/xtks_holidays.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xbru.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xmad.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xetr.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xeee.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xdus.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xshg.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xosl.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xbse.py -> build/lib/exchange_calendars copying exchange_calendars/calendar_utils.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xtai.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xsto.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xpra.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xpar.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xist.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xkrx.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xlis.py -> build/lib/exchange_calendars copying exchange_calendars/__init__.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xams.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xlon.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xtks.py -> build/lib/exchange_calendars copying exchange_calendars/xkls_holidays.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xlim.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_bvmf.py -> build/lib/exchange_calendars copying exchange_calendars/us_futures_calendar.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xphs.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_cmes.py -> build/lib/exchange_calendars copying exchange_calendars/weekday_calendar.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xice.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xsau.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xbkk.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xcbf.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xbud.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xkar.py -> build/lib/exchange_calendars copying exchange_calendars/common_holidays.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xwar.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xjse.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xcse.py -> build/lib/exchange_calendars copying exchange_calendars/ecal.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xham.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xmos.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xmex.py -> build/lib/exchange_calendars copying exchange_calendars/exchange_calendar_xbom.py -> build/lib/exchange_calendars creating build/lib/exchange_calendars/pandas_extensions copying exchange_calendars/pandas_extensions/offsets.py -> build/lib/exchange_calendars/pandas_extensions copying exchange_calendars/pandas_extensions/korean_holiday.py -> build/lib/exchange_calendars/pandas_extensions copying exchange_calendars/pandas_extensions/__init__.py -> build/lib/exchange_calendars/pandas_extensions copying exchange_calendars/pandas_extensions/holiday.py -> build/lib/exchange_calendars/pandas_extensions creating build/lib/exchange_calendars/utils copying exchange_calendars/utils/pandas_utils.py -> build/lib/exchange_calendars/utils copying exchange_calendars/utils/__init__.py -> build/lib/exchange_calendars/utils running egg_info creating exchange_calendars.egg-info writing exchange_calendars.egg-info/PKG-INFO writing dependency_links to exchange_calendars.egg-info/dependency_links.txt writing entry points to exchange_calendars.egg-info/entry_points.txt writing requirements to exchange_calendars.egg-info/requires.txt writing top-level names to exchange_calendars.egg-info/top_level.txt writing manifest file 'exchange_calendars.egg-info/SOURCES.txt' reading manifest file 'exchange_calendars.egg-info/SOURCES.txt' reading manifest template 'MANIFEST.in' warning: no previously-included files matching '*' found under directory '.devcontainer' warning: no previously-included files matching '*' found under directory '.github' adding license file 'LICENSE' writing manifest file 'exchange_calendars.egg-info/SOURCES.txt' installing to build/bdist.linux-armv7l/wheel running install running install_lib creating build/bdist.linux-armv7l creating build/bdist.linux-armv7l/wheel creating build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xmil.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/calendar_helpers.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xsgo.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/lunisolar_holidays.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xswx.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_iepa.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/tase_holidays.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xfra.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/xbkk_holidays.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xidx.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xhkg.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xasx.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xses.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xtse.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/xkrx_holidays.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/always_open.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/errors.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xhel.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xwbo.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xkls.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/precomputed_exchange_calendar.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xdub.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_asex.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xnys.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xtae.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xbue.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/us_holidays.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_aixk.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xbog.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xnze.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/xtks_holidays.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xbru.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xmad.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xetr.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xeee.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xdus.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xshg.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xosl.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xbse.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/calendar_utils.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xtai.py -> build/bdist.linux-armv7l/wheel/exchange_calendars creating build/bdist.linux-armv7l/wheel/exchange_calendars/pandas_extensions copying build/lib/exchange_calendars/pandas_extensions/offsets.py -> build/bdist.linux-armv7l/wheel/exchange_calendars/pandas_extensions copying build/lib/exchange_calendars/pandas_extensions/korean_holiday.py -> build/bdist.linux-armv7l/wheel/exchange_calendars/pandas_extensions copying build/lib/exchange_calendars/pandas_extensions/__init__.py -> build/bdist.linux-armv7l/wheel/exchange_calendars/pandas_extensions copying build/lib/exchange_calendars/pandas_extensions/holiday.py -> build/bdist.linux-armv7l/wheel/exchange_calendars/pandas_extensions copying build/lib/exchange_calendars/exchange_calendar_xsto.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xpra.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xpar.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xist.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xkrx.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xlis.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/__init__.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xams.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xlon.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xtks.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/xkls_holidays.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xlim.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_bvmf.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/us_futures_calendar.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xphs.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_cmes.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/weekday_calendar.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xice.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xsau.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xbkk.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xcbf.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xbud.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xkar.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/common_holidays.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xwar.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xjse.py -> build/bdist.linux-armv7l/wheel/exchange_calendars creating build/bdist.linux-armv7l/wheel/exchange_calendars/utils copying build/lib/exchange_calendars/utils/pandas_utils.py -> build/bdist.linux-armv7l/wheel/exchange_calendars/utils copying build/lib/exchange_calendars/utils/__init__.py -> build/bdist.linux-armv7l/wheel/exchange_calendars/utils copying build/lib/exchange_calendars/exchange_calendar_xcse.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/ecal.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xham.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xmos.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xmex.py -> build/bdist.linux-armv7l/wheel/exchange_calendars copying build/lib/exchange_calendars/exchange_calendar_xbom.py -> build/bdist.linux-armv7l/wheel/exchange_calendars running install_egg_info Copying exchange_calendars.egg-info to build/bdist.linux-armv7l/wheel/exchange_calendars-0.0.0.egg-info running install_scripts creating build/bdist.linux-armv7l/wheel/exchange_calendars-0.0.0.dist-info/WHEEL creating '/build/reproducible-path/exchange-calendars-4.5.5/.pybuild/cpython3_3.12_exchange-calendars/.tmp-8yd9m8p_/exchange_calendars-0.0.0-py3-none-any.whl' and adding 'build/bdist.linux-armv7l/wheel' to it adding 'exchange_calendars/__init__.py' adding 'exchange_calendars/always_open.py' adding 'exchange_calendars/calendar_helpers.py' adding 'exchange_calendars/calendar_utils.py' adding 'exchange_calendars/common_holidays.py' adding 'exchange_calendars/ecal.py' adding 'exchange_calendars/errors.py' adding 'exchange_calendars/exchange_calendar.py' adding 'exchange_calendars/exchange_calendar_aixk.py' adding 'exchange_calendars/exchange_calendar_asex.py' adding 'exchange_calendars/exchange_calendar_bvmf.py' adding 'exchange_calendars/exchange_calendar_cmes.py' adding 'exchange_calendars/exchange_calendar_iepa.py' adding 'exchange_calendars/exchange_calendar_xams.py' adding 'exchange_calendars/exchange_calendar_xasx.py' adding 'exchange_calendars/exchange_calendar_xbkk.py' adding 'exchange_calendars/exchange_calendar_xbog.py' adding 'exchange_calendars/exchange_calendar_xbom.py' adding 'exchange_calendars/exchange_calendar_xbru.py' adding 'exchange_calendars/exchange_calendar_xbse.py' adding 'exchange_calendars/exchange_calendar_xbud.py' adding 'exchange_calendars/exchange_calendar_xbue.py' adding 'exchange_calendars/exchange_calendar_xcbf.py' adding 'exchange_calendars/exchange_calendar_xcse.py' adding 'exchange_calendars/exchange_calendar_xdub.py' adding 'exchange_calendars/exchange_calendar_xdus.py' adding 'exchange_calendars/exchange_calendar_xeee.py' adding 'exchange_calendars/exchange_calendar_xetr.py' adding 'exchange_calendars/exchange_calendar_xfra.py' adding 'exchange_calendars/exchange_calendar_xham.py' adding 'exchange_calendars/exchange_calendar_xhel.py' adding 'exchange_calendars/exchange_calendar_xhkg.py' adding 'exchange_calendars/exchange_calendar_xice.py' adding 'exchange_calendars/exchange_calendar_xidx.py' adding 'exchange_calendars/exchange_calendar_xist.py' adding 'exchange_calendars/exchange_calendar_xjse.py' adding 'exchange_calendars/exchange_calendar_xkar.py' adding 'exchange_calendars/exchange_calendar_xkls.py' adding 'exchange_calendars/exchange_calendar_xkrx.py' adding 'exchange_calendars/exchange_calendar_xlim.py' adding 'exchange_calendars/exchange_calendar_xlis.py' adding 'exchange_calendars/exchange_calendar_xlon.py' adding 'exchange_calendars/exchange_calendar_xmad.py' adding 'exchange_calendars/exchange_calendar_xmex.py' adding 'exchange_calendars/exchange_calendar_xmil.py' adding 'exchange_calendars/exchange_calendar_xmos.py' adding 'exchange_calendars/exchange_calendar_xnys.py' adding 'exchange_calendars/exchange_calendar_xnze.py' adding 'exchange_calendars/exchange_calendar_xosl.py' adding 'exchange_calendars/exchange_calendar_xpar.py' adding 'exchange_calendars/exchange_calendar_xphs.py' adding 'exchange_calendars/exchange_calendar_xpra.py' adding 'exchange_calendars/exchange_calendar_xsau.py' adding 'exchange_calendars/exchange_calendar_xses.py' adding 'exchange_calendars/exchange_calendar_xsgo.py' adding 'exchange_calendars/exchange_calendar_xshg.py' adding 'exchange_calendars/exchange_calendar_xsto.py' adding 'exchange_calendars/exchange_calendar_xswx.py' adding 'exchange_calendars/exchange_calendar_xtae.py' adding 'exchange_calendars/exchange_calendar_xtai.py' adding 'exchange_calendars/exchange_calendar_xtks.py' adding 'exchange_calendars/exchange_calendar_xtse.py' adding 'exchange_calendars/exchange_calendar_xwar.py' adding 'exchange_calendars/exchange_calendar_xwbo.py' adding 'exchange_calendars/lunisolar_holidays.py' adding 'exchange_calendars/precomputed_exchange_calendar.py' adding 'exchange_calendars/tase_holidays.py' adding 'exchange_calendars/us_futures_calendar.py' adding 'exchange_calendars/us_holidays.py' adding 'exchange_calendars/weekday_calendar.py' adding 'exchange_calendars/xbkk_holidays.py' adding 'exchange_calendars/xkls_holidays.py' adding 'exchange_calendars/xkrx_holidays.py' adding 'exchange_calendars/xtks_holidays.py' adding 'exchange_calendars/pandas_extensions/__init__.py' adding 'exchange_calendars/pandas_extensions/holiday.py' adding 'exchange_calendars/pandas_extensions/korean_holiday.py' adding 'exchange_calendars/pandas_extensions/offsets.py' adding 'exchange_calendars/utils/__init__.py' adding 'exchange_calendars/utils/pandas_utils.py' adding 'exchange_calendars-0.0.0.dist-info/LICENSE' adding 'exchange_calendars-0.0.0.dist-info/METADATA' adding 'exchange_calendars-0.0.0.dist-info/WHEEL' adding 'exchange_calendars-0.0.0.dist-info/entry_points.txt' adding 'exchange_calendars-0.0.0.dist-info/top_level.txt' adding 'exchange_calendars-0.0.0.dist-info/RECORD' removing build/bdist.linux-armv7l/wheel Successfully built exchange_calendars-0.0.0-py3-none-any.whl I: pybuild plugin_pyproject:144: Unpacking wheel built for python3.12 with "installer" module dh_auto_test -O--buildsystem=pybuild I: pybuild base:311: cd /build/reproducible-path/exchange-calendars-4.5.5/.pybuild/cpython3_3.12_exchange-calendars/build; python3.12 -m pytest tests ============================= test session starts ============================== platform linux -- Python 3.12.4, pytest-8.3.2, pluggy-1.5.0 -- /usr/bin/python3.12 cachedir: .pytest_cache hypothesis profile 'default' -> database=DirectoryBasedExampleDatabase(PosixPath('/build/reproducible-path/exchange-calendars-4.5.5/.pybuild/cpython3_3.12_exchange-calendars/build/.hypothesis/examples')) rootdir: /build/reproducible-path/exchange-calendars-4.5.5 configfile: setup.cfg plugins: hypothesis-6.105.1 collecting ... collected 8189 items tests/test_aixk_calendar.py::TestAIXKCalendar::test_testbase_integrity PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_base_integrity PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_calculated_against_csv PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_start_end PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_invalid_input PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_bound_min PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_bound_max PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_sanity_check_session_lengths PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_adhoc_holidays_specification PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_daylight_savings PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_sessions PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_opens_closes_break_starts_ends PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minutes_properties[both] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minutes[both] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_calendar_bounds_properties[both] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_session_minute_methods[both] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_session_minutes[both] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_is_trading_minute[both] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_is_break_minute[both] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_is_open_on_minute[both] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_is_open_at_time[both] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_prev_next_minute[both] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_to_session[both-next] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_to_trading_minute[both-next] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_to_session[left-next] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_to_trading_minute[left-next] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minutes_properties[left] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minutes[left] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_calendar_bounds_properties[left] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_session_minute_methods[left] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_session_minutes[left] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_is_trading_minute[left] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_is_break_minute[left] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_is_open_on_minute[left] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_is_open_at_time[left] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_prev_next_minute[left] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_to_session[left-previous] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_to_session[both-previous] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_to_session[right-previous] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_to_session[right-next] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_to_trading_minute[right-next] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minutes_properties[right] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minutes[right] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_calendar_bounds_properties[right] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_session_minute_methods[right] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_session_minutes[right] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_is_trading_minute[right] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_is_break_minute[right] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_is_open_on_minute[right] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_is_open_at_time[right] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_prev_next_minute[right] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_to_session[right-none] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_to_trading_minute[right-none] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_to_session[left-none] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_to_trading_minute[left-none] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_to_session[both-none] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_to_trading_minute[both-none] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_to_session[neither-none] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_to_session[neither-previous] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_to_session[neither-next] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minutes_properties[neither] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minutes[neither] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_calendar_bounds_properties[neither] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_session_minute_methods[neither] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_session_minutes[neither] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_is_trading_minute[neither] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_is_break_minute[neither] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_is_open_on_minute[neither] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_is_open_at_time[neither] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_prev_next_minute[neither] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_to_past_session[neither] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_to_future_session[neither] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_offset[neither] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_offset_by_sessions[neither] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minutes_in_range[neither] PASSED [ 0%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minutes_window[neither] PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minutes_distance[neither] PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minutes_to_sessions[neither] PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_sessions_minutes[neither] PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_sessions_minutes_count[neither] PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_to_past_session[right] PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_to_future_session[right] PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_offset[right] PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_offset_by_sessions[right] PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minutes_in_range[right] PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minutes_window[right] PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minutes_distance[right] PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minutes_to_sessions[right] PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_sessions_minutes[right] PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_sessions_minutes_count[right] PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_to_past_session[left] PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_to_future_session[left] PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_offset[left] PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_offset_by_sessions[left] PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minutes_in_range[left] PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minutes_window[left] PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minutes_distance[left] PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minutes_to_sessions[left] PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_sessions_minutes[left] PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_sessions_minutes_count[left] PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_to_past_session[both] PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_to_future_session[both] PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_offset[both] PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minute_offset_by_sessions[both] PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minutes_in_range[both] PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minutes_window[both] PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minutes_distance[both] PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_minutes_to_sessions[both] PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_sessions_minutes[both] PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_sessions_minutes_count[both] PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_has_break PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_regular_holidays_sample PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_adhoc_holidays_sample PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_non_holidays_sample PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_late_opens_sample PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_early_closes_sample PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_early_closes_sample_time PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_early_closes_weekdays PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_early_closes_weekdays_time PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_non_early_closes_sample PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_non_early_closes_sample_time PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_late_opens PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_early_closes PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_session_open_close_break_start_end PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_session_has_break PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_next_prev_session PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_session_offset PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_is_session PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_date_to_session PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_prev_next_open_close PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_sessions_in_range PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_sessions_has_break PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_sessions_window PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_sessions_distance PASSED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_trading_index FAILED [ 1%] tests/test_aixk_calendar.py::TestAIXKCalendar::test_deprecated PASSED [ 1%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_testbase_integrity PASSED [ 1%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_base_integrity PASSED [ 1%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_calculated_against_csv PASSED [ 1%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_start_end PASSED [ 1%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_invalid_input PASSED [ 1%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_bound_min PASSED [ 1%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_bound_max PASSED [ 1%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_sanity_check_session_lengths PASSED [ 1%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_adhoc_holidays_specification PASSED [ 1%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_daylight_savings PASSED [ 1%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_sessions PASSED [ 1%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_opens_closes_break_starts_ends PASSED [ 1%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_minutes_properties[left] PASSED [ 1%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_minutes[left] PASSED [ 1%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_calendar_bounds_properties[left] PASSED [ 1%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_session_minute_methods[left] PASSED [ 1%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_session_minutes[left] PASSED [ 1%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_is_trading_minute[left] PASSED [ 1%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_is_break_minute[left] PASSED [ 1%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_is_open_on_minute[left] PASSED [ 1%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_is_open_at_time[left] PASSED [ 1%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_prev_next_minute[left] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_minute_to_session[left-next] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_minute_to_trading_minute[left-next] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_minute_to_session[right-next] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_minute_to_trading_minute[right-next] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_minutes_properties[right] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_minutes[right] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_calendar_bounds_properties[right] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_session_minute_methods[right] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_session_minutes[right] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_is_trading_minute[right] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_is_break_minute[right] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_is_open_on_minute[right] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_is_open_at_time[right] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_prev_next_minute[right] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_minute_to_session[right-previous] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_minute_to_session[left-previous] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_minute_to_session[right-none] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_minute_to_trading_minute[right-none] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_minute_to_session[left-none] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_minute_to_trading_minute[left-none] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_minute_to_past_session[right] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_minute_to_future_session[right] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_minute_offset[right] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_minute_offset_by_sessions[right] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_minutes_in_range[right] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_minutes_window[right] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_minutes_distance[right] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_minutes_to_sessions[right] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_sessions_minutes[right] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_sessions_minutes_count[right] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_minute_to_past_session[left] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_minute_to_future_session[left] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_minute_offset[left] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_minute_offset_by_sessions[left] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_minutes_in_range[left] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_minutes_window[left] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_minutes_distance[left] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_minutes_to_sessions[left] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_sessions_minutes[left] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_sessions_minutes_count[left] PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_has_break PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_regular_holidays_sample PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_adhoc_holidays_sample PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_non_holidays_sample PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_late_opens_sample PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_early_closes_sample PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_early_closes_sample_time PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_early_closes_weekdays PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_early_closes_weekdays_time PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_non_early_closes_sample PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_non_early_closes_sample_time PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_late_opens PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_early_closes PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_session_open_close_break_start_end PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_session_has_break PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_next_prev_session PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_session_offset PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_is_session PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_date_to_session PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_prev_next_open_close PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_sessions_in_range PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_sessions_has_break PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_sessions_window PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_sessions_distance PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_trading_index FAILED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_deprecated PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_open_every_day PASSED [ 2%] tests/test_always_open.py::TestAlwaysOpenCalendar::test_open_every_minute PASSED [ 2%] tests/test_asex_calendar.py::TestASEXCalendar::test_testbase_integrity PASSED [ 2%] tests/test_asex_calendar.py::TestASEXCalendar::test_base_integrity PASSED [ 2%] tests/test_asex_calendar.py::TestASEXCalendar::test_calculated_against_csv PASSED [ 2%] tests/test_asex_calendar.py::TestASEXCalendar::test_start_end PASSED [ 2%] tests/test_asex_calendar.py::TestASEXCalendar::test_invalid_input PASSED [ 2%] tests/test_asex_calendar.py::TestASEXCalendar::test_bound_min PASSED [ 2%] tests/test_asex_calendar.py::TestASEXCalendar::test_bound_max PASSED [ 2%] tests/test_asex_calendar.py::TestASEXCalendar::test_sanity_check_session_lengths PASSED [ 2%] tests/test_asex_calendar.py::TestASEXCalendar::test_adhoc_holidays_specification PASSED [ 2%] tests/test_asex_calendar.py::TestASEXCalendar::test_daylight_savings PASSED [ 2%] tests/test_asex_calendar.py::TestASEXCalendar::test_sessions PASSED [ 2%] tests/test_asex_calendar.py::TestASEXCalendar::test_opens_closes_break_starts_ends PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minutes_properties[both] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minutes[both] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_calendar_bounds_properties[both] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_session_minute_methods[both] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_session_minutes[both] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_is_trading_minute[both] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_is_break_minute[both] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_is_open_on_minute[both] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_is_open_at_time[both] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_prev_next_minute[both] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_to_session[both-next] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_to_trading_minute[both-next] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_to_session[left-next] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_to_trading_minute[left-next] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minutes_properties[left] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minutes[left] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_calendar_bounds_properties[left] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_session_minute_methods[left] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_session_minutes[left] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_is_trading_minute[left] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_is_break_minute[left] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_is_open_on_minute[left] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_is_open_at_time[left] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_prev_next_minute[left] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_to_session[left-previous] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_to_session[both-previous] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_to_session[right-previous] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_to_session[right-next] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_to_trading_minute[right-next] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minutes_properties[right] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minutes[right] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_calendar_bounds_properties[right] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_session_minute_methods[right] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_session_minutes[right] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_is_trading_minute[right] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_is_break_minute[right] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_is_open_on_minute[right] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_is_open_at_time[right] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_prev_next_minute[right] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_to_session[right-none] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_to_trading_minute[right-none] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_to_session[left-none] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_to_trading_minute[left-none] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_to_session[both-none] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_to_trading_minute[both-none] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_to_session[neither-none] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_to_session[neither-previous] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_to_session[neither-next] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minutes_properties[neither] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minutes[neither] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_calendar_bounds_properties[neither] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_session_minute_methods[neither] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_session_minutes[neither] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_is_trading_minute[neither] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_is_break_minute[neither] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_is_open_on_minute[neither] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_is_open_at_time[neither] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_prev_next_minute[neither] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_to_past_session[neither] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_to_future_session[neither] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_offset[neither] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_offset_by_sessions[neither] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minutes_in_range[neither] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minutes_window[neither] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minutes_distance[neither] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minutes_to_sessions[neither] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_sessions_minutes[neither] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_sessions_minutes_count[neither] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_to_past_session[right] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_to_future_session[right] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_offset[right] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_offset_by_sessions[right] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minutes_in_range[right] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minutes_window[right] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minutes_distance[right] PASSED [ 3%] tests/test_asex_calendar.py::TestASEXCalendar::test_minutes_to_sessions[right] PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_sessions_minutes[right] PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_sessions_minutes_count[right] PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_to_past_session[left] PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_to_future_session[left] PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_offset[left] PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_offset_by_sessions[left] PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_minutes_in_range[left] PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_minutes_window[left] PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_minutes_distance[left] PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_minutes_to_sessions[left] PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_sessions_minutes[left] PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_sessions_minutes_count[left] PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_to_past_session[both] PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_to_future_session[both] PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_offset[both] PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_minute_offset_by_sessions[both] PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_minutes_in_range[both] PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_minutes_window[both] PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_minutes_distance[both] PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_minutes_to_sessions[both] PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_sessions_minutes[both] PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_sessions_minutes_count[both] PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_has_break PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_regular_holidays_sample PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_adhoc_holidays_sample PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_non_holidays_sample PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_late_opens_sample PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_early_closes_sample PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_early_closes_sample_time PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_early_closes_weekdays PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_early_closes_weekdays_time PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_non_early_closes_sample PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_non_early_closes_sample_time PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_late_opens PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_early_closes PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_session_open_close_break_start_end PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_session_has_break PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_next_prev_session PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_session_offset PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_is_session PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_date_to_session PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_prev_next_open_close PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_sessions_in_range PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_sessions_has_break PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_sessions_window PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_sessions_distance PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_trading_index FAILED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_deprecated PASSED [ 4%] tests/test_asex_calendar.py::TestASEXCalendar::test_close_time_change PASSED [ 4%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_testbase_integrity PASSED [ 4%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_base_integrity PASSED [ 4%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_calculated_against_csv PASSED [ 4%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_start_end PASSED [ 4%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_invalid_input PASSED [ 4%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_bound_min PASSED [ 4%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_bound_max PASSED [ 4%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_sanity_check_session_lengths PASSED [ 4%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_adhoc_holidays_specification PASSED [ 4%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_daylight_savings PASSED [ 4%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_sessions PASSED [ 4%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_opens_closes_break_starts_ends PASSED [ 4%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minutes_properties[both] PASSED [ 4%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minutes[both] PASSED [ 4%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_calendar_bounds_properties[both] PASSED [ 4%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_session_minute_methods[both] PASSED [ 4%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_session_minutes[both] PASSED [ 4%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_is_trading_minute[both] PASSED [ 4%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_is_break_minute[both] PASSED [ 4%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_is_open_on_minute[both] PASSED [ 4%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_is_open_at_time[both] PASSED [ 4%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_prev_next_minute[both] PASSED [ 4%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_to_session[both-next] PASSED [ 4%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_to_trading_minute[both-next] PASSED [ 4%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_to_session[left-next] PASSED [ 4%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_to_trading_minute[left-next] PASSED [ 4%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minutes_properties[left] PASSED [ 4%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minutes[left] PASSED [ 4%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_calendar_bounds_properties[left] PASSED [ 4%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_session_minute_methods[left] PASSED [ 4%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_session_minutes[left] PASSED [ 4%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_is_trading_minute[left] PASSED [ 4%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_is_break_minute[left] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_is_open_on_minute[left] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_is_open_at_time[left] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_prev_next_minute[left] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_to_session[left-previous] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_to_session[both-previous] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_to_session[right-previous] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_to_session[right-next] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_to_trading_minute[right-next] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minutes_properties[right] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minutes[right] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_calendar_bounds_properties[right] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_session_minute_methods[right] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_session_minutes[right] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_is_trading_minute[right] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_is_break_minute[right] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_is_open_on_minute[right] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_is_open_at_time[right] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_prev_next_minute[right] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_to_session[right-none] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_to_trading_minute[right-none] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_to_session[left-none] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_to_trading_minute[left-none] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_to_session[both-none] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_to_trading_minute[both-none] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_to_session[neither-none] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_to_session[neither-previous] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_to_session[neither-next] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minutes_properties[neither] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minutes[neither] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_calendar_bounds_properties[neither] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_session_minute_methods[neither] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_session_minutes[neither] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_is_trading_minute[neither] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_is_break_minute[neither] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_is_open_on_minute[neither] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_is_open_at_time[neither] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_prev_next_minute[neither] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_to_past_session[neither] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_to_future_session[neither] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_offset[neither] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_offset_by_sessions[neither] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minutes_in_range[neither] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minutes_window[neither] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minutes_distance[neither] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minutes_to_sessions[neither] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_sessions_minutes[neither] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_sessions_minutes_count[neither] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_to_past_session[right] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_to_future_session[right] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_offset[right] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_offset_by_sessions[right] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minutes_in_range[right] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minutes_window[right] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minutes_distance[right] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minutes_to_sessions[right] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_sessions_minutes[right] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_sessions_minutes_count[right] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_to_past_session[left] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_to_future_session[left] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_offset[left] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_offset_by_sessions[left] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minutes_in_range[left] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minutes_window[left] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minutes_distance[left] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minutes_to_sessions[left] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_sessions_minutes[left] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_sessions_minutes_count[left] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_to_past_session[both] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_to_future_session[both] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_offset[both] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minute_offset_by_sessions[both] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minutes_in_range[both] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minutes_window[both] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minutes_distance[both] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_minutes_to_sessions[both] PASSED [ 5%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_sessions_minutes[both] PASSED [ 6%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_sessions_minutes_count[both] PASSED [ 6%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_has_break PASSED [ 6%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_regular_holidays_sample PASSED [ 6%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_adhoc_holidays_sample PASSED [ 6%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_non_holidays_sample PASSED [ 6%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_late_opens_sample PASSED [ 6%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_early_closes_sample PASSED [ 6%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_early_closes_sample_time PASSED [ 6%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_early_closes_weekdays PASSED [ 6%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_early_closes_weekdays_time PASSED [ 6%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_non_early_closes_sample PASSED [ 6%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_non_early_closes_sample_time PASSED [ 6%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_late_opens PASSED [ 6%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_early_closes PASSED [ 6%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_session_open_close_break_start_end PASSED [ 6%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_session_has_break PASSED [ 6%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_next_prev_session PASSED [ 6%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_session_offset PASSED [ 6%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_is_session PASSED [ 6%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_date_to_session PASSED [ 6%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_prev_next_open_close PASSED [ 6%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_sessions_in_range PASSED [ 6%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_sessions_has_break PASSED [ 6%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_sessions_window PASSED [ 6%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_sessions_distance PASSED [ 6%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_trading_index FAILED [ 6%] tests/test_bvmf_calendar.py::TestBVMFCalendar::test_deprecated PASSED [ 6%] tests/test_calendar_dispatcher.py::CalendarDispatcherTestCase::test_add_new_aliases PASSED [ 6%] tests/test_calendar_dispatcher.py::CalendarDispatcherTestCase::test_aliases_to_names PASSED [ 6%] tests/test_calendar_dispatcher.py::CalendarDispatcherTestCase::test_allow_alias_override_with_force PASSED [ 6%] tests/test_calendar_dispatcher.py::CalendarDispatcherTestCase::test_follow_alias_chain PASSED [ 6%] tests/test_calendar_dispatcher.py::CalendarDispatcherTestCase::test_get_calendar PASSED [ 6%] tests/test_calendar_dispatcher.py::CalendarDispatcherTestCase::test_get_calendar_cache PASSED [ 6%] tests/test_calendar_dispatcher.py::CalendarDispatcherTestCase::test_get_calendar_kwargs PASSED [ 6%] tests/test_calendar_dispatcher.py::CalendarDispatcherTestCase::test_get_calendar_names PASSED [ 6%] tests/test_calendar_dispatcher.py::CalendarDispatcherTestCase::test_names_to_aliases PASSED [ 6%] tests/test_calendar_dispatcher.py::CalendarDispatcherTestCase::test_reject_alias_that_already_exists PASSED [ 6%] tests/test_calendar_dispatcher.py::CalendarDispatcherTestCase::test_reject_cyclic_aliases PASSED [ 6%] tests/test_calendar_dispatcher.py::CalendarDispatcherTestCase::test_remove_aliases PASSED [ 6%] tests/test_calendar_helpers.py::test_constants PASSED [ 6%] tests/test_calendar_helpers.py::test_is_date PASSED [ 6%] tests/test_calendar_helpers.py::test_is_utc PASSED [ 6%] tests/test_calendar_helpers.py::test_parse_timestamp_with_date[2021-06-05-True] PASSED [ 6%] tests/test_calendar_helpers.py::test_parse_timestamp_with_date[2021-06-05-False] PASSED [ 6%] tests/test_calendar_helpers.py::test_parse_timestamp_with_date[date_mult1-True] PASSED [ 6%] tests/test_calendar_helpers.py::test_parse_timestamp_with_date[date_mult1-False] PASSED [ 6%] tests/test_calendar_helpers.py::test_parse_timestamp_with_minute[2021-06-02 23:00-True] PASSED [ 6%] tests/test_calendar_helpers.py::test_parse_timestamp_with_minute[2021-06-02 23:00-False] PASSED [ 6%] tests/test_calendar_helpers.py::test_parse_timestamp_with_minute[minute_mult1-True] PASSED [ 6%] tests/test_calendar_helpers.py::test_parse_timestamp_with_minute[minute_mult1-False] PASSED [ 6%] tests/test_calendar_helpers.py::test_parse_timestamp_with_minute[minute_mult2-True] PASSED [ 6%] tests/test_calendar_helpers.py::test_parse_timestamp_with_minute[minute_mult2-False] PASSED [ 6%] tests/test_calendar_helpers.py::test_parse_timestamp_with_second[left] PASSED [ 6%] tests/test_calendar_helpers.py::test_parse_timestamp_with_second[right] PASSED [ 6%] tests/test_calendar_helpers.py::test_parse_timestamp_with_second[both] PASSED [ 6%] tests/test_calendar_helpers.py::test_parse_timestamp_with_second[neither] PASSED [ 6%] tests/test_calendar_helpers.py::test_parse_timestamp_error_malformed[2021-13-13] PASSED [ 6%] tests/test_calendar_helpers.py::test_parse_timestamp_error_malformed[malformed1] PASSED [ 6%] tests/test_calendar_helpers.py::test_parse_timestamp_error_malformed[not a timestamp] PASSED [ 6%] tests/test_calendar_helpers.py::test_parse_timestamp_error_oob PASSED [ 6%] tests/test_calendar_helpers.py::test_parse_date_or_minute_for_minute[2021-06-02 23:00] PASSED [ 6%] tests/test_calendar_helpers.py::test_parse_date_or_minute_for_minute[minute_mult1] PASSED [ 6%] tests/test_calendar_helpers.py::test_parse_date_or_minute_for_minute[minute_mult2] PASSED [ 6%] tests/test_calendar_helpers.py::test_parse_date_or_minute_for_date[2021-06-05] PASSED [ 6%] tests/test_calendar_helpers.py::test_parse_date_or_minute_for_date[date_mult1] PASSED [ 6%] tests/test_calendar_helpers.py::test_parse_date_or_minute_oob PASSED [ 6%] tests/test_calendar_helpers.py::test_parse_date[2021-06-05] PASSED [ 6%] tests/test_calendar_helpers.py::test_parse_date[date_mult1] PASSED [ 6%] tests/test_calendar_helpers.py::test_parse_date_errors PASSED [ 6%] tests/test_calendar_helpers.py::test_parse_session PASSED [ 6%] tests/test_calendar_helpers.py::test_parse_trading_minute PASSED [ 6%] tests/test_calendar_helpers.py::TestTradingIndex::test_indices_fuzz[XLON] FAILED [ 6%] tests/test_calendar_helpers.py::TestTradingIndex::test_intervals_fuzz[XLON] FAILED [ 6%] tests/test_calendar_helpers.py::TestTradingIndex::test_daily_fuzz[XLON] PASSED [ 6%] tests/test_calendar_helpers.py::TestTradingIndex::test_indices_fuzz[XHKG] FAILED [ 6%] tests/test_calendar_helpers.py::TestTradingIndex::test_intervals_fuzz[XHKG] FAILED [ 6%] tests/test_calendar_helpers.py::TestTradingIndex::test_daily_fuzz[XHKG] PASSED [ 6%] tests/test_calendar_helpers.py::TestTradingIndex::test_indices_fuzz[XTAE] FAILED [ 6%] tests/test_calendar_helpers.py::TestTradingIndex::test_intervals_fuzz[XTAE] FAILED [ 6%] tests/test_calendar_helpers.py::TestTradingIndex::test_daily_fuzz[XTAE] PASSED [ 6%] tests/test_calendar_helpers.py::TestTradingIndex::test_indices_fuzz[CMES] FAILED [ 6%] tests/test_calendar_helpers.py::TestTradingIndex::test_intervals_fuzz[CMES] FAILED [ 7%] tests/test_calendar_helpers.py::TestTradingIndex::test_daily_fuzz[CMES] PASSED [ 7%] tests/test_calendar_helpers.py::TestTradingIndex::test_indices_fuzz[24/7] FAILED [ 7%] tests/test_calendar_helpers.py::TestTradingIndex::test_intervals_fuzz[24/7] FAILED [ 7%] tests/test_calendar_helpers.py::TestTradingIndex::test_daily_fuzz[24/7] PASSED [ 7%] tests/test_calendar_helpers.py::TestTradingIndex::test_for_empty_with_neither_fuzz FAILED [ 7%] tests/test_calendar_helpers.py::TestTradingIndex::test_overlap_error_fuzz[XHKG] FAILED [ 7%] tests/test_calendar_helpers.py::TestTradingIndex::test_overlap_error_fuzz[24/7] FAILED [ 7%] tests/test_calendar_helpers.py::TestTradingIndex::test_overlap_error_fuzz[CMES] FAILED [ 7%] tests/test_calendar_helpers.py::TestTradingIndex::test_overlaps[ti_for_overlap0-True] FAILED [ 7%] tests/test_calendar_helpers.py::TestTradingIndex::test_overlaps[ti_for_overlap0-False] FAILED [ 7%] tests/test_calendar_helpers.py::TestTradingIndex::test_overlaps[ti_for_overlap1-True] PASSED [ 7%] tests/test_calendar_helpers.py::TestTradingIndex::test_overlaps[ti_for_overlap1-False] PASSED [ 7%] tests/test_calendar_helpers.py::TestTradingIndex::test_overlaps[ti_for_overlap2-True] FAILED [ 7%] tests/test_calendar_helpers.py::TestTradingIndex::test_overlaps[ti_for_overlap2-False] FAILED [ 7%] tests/test_calendar_helpers.py::TestTradingIndex::test_overlaps[ti_for_overlap3-True] PASSED [ 7%] tests/test_calendar_helpers.py::TestTradingIndex::test_overlaps[ti_for_overlap3-False] PASSED [ 7%] tests/test_calendar_helpers.py::TestTradingIndex::test_overlaps_2[right-True] FAILED [ 7%] tests/test_calendar_helpers.py::TestTradingIndex::test_overlaps_2[right-False] FAILED [ 7%] tests/test_calendar_helpers.py::TestTradingIndex::test_overlaps_2[both-True] FAILED [ 7%] tests/test_calendar_helpers.py::TestTradingIndex::test_overlaps_2[both-False] FAILED [ 7%] tests/test_calendar_helpers.py::TestTradingIndex::test_force FAILED [ 7%] tests/test_calendar_helpers.py::TestTradingIndex::test_ignore_breaks FAILED [ 7%] tests/test_calendar_helpers.py::TestTradingIndex::test_align FAILED [ 7%] tests/test_calendar_helpers.py::TestTradingIndex::test_align_overlap FAILED [ 7%] tests/test_calendar_helpers.py::TestTradingIndex::test_start_end_times FAILED [ 7%] tests/test_calendar_helpers.py::TestTradingIndex::test_parsing_errors PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_testbase_integrity PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_base_integrity PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_calculated_against_csv PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_start_end PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_invalid_input PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_bound_min PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_bound_max PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_sanity_check_session_lengths PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_adhoc_holidays_specification PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_daylight_savings PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_sessions PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_opens_closes_break_starts_ends PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_minutes_properties[left] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_minutes[left] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_calendar_bounds_properties[left] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_session_minute_methods[left] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_session_minutes[left] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_is_trading_minute[left] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_is_break_minute[left] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_is_open_on_minute[left] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_is_open_at_time[left] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_prev_next_minute[left] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_minute_to_session[left-next] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_minute_to_trading_minute[left-next] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_minute_to_session[right-next] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_minute_to_trading_minute[right-next] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_minutes_properties[right] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_minutes[right] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_calendar_bounds_properties[right] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_session_minute_methods[right] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_session_minutes[right] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_is_trading_minute[right] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_is_break_minute[right] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_is_open_on_minute[right] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_is_open_at_time[right] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_prev_next_minute[right] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_minute_to_session[right-previous] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_minute_to_session[left-previous] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_minute_to_session[right-none] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_minute_to_trading_minute[right-none] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_minute_to_session[left-none] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_minute_to_trading_minute[left-none] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_minute_to_past_session[right] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_minute_to_future_session[right] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_minute_offset[right] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_minute_offset_by_sessions[right] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_minutes_in_range[right] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_minutes_window[right] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_minutes_distance[right] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_minutes_to_sessions[right] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_sessions_minutes[right] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_sessions_minutes_count[right] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_minute_to_past_session[left] PASSED [ 7%] tests/test_cmes_calendar.py::TestCMESCalendar::test_minute_to_future_session[left] PASSED [ 8%] tests/test_cmes_calendar.py::TestCMESCalendar::test_minute_offset[left] PASSED [ 8%] tests/test_cmes_calendar.py::TestCMESCalendar::test_minute_offset_by_sessions[left] PASSED [ 8%] tests/test_cmes_calendar.py::TestCMESCalendar::test_minutes_in_range[left] PASSED [ 8%] tests/test_cmes_calendar.py::TestCMESCalendar::test_minutes_window[left] PASSED [ 8%] tests/test_cmes_calendar.py::TestCMESCalendar::test_minutes_distance[left] PASSED [ 8%] tests/test_cmes_calendar.py::TestCMESCalendar::test_minutes_to_sessions[left] PASSED [ 8%] tests/test_cmes_calendar.py::TestCMESCalendar::test_sessions_minutes[left] PASSED [ 8%] tests/test_cmes_calendar.py::TestCMESCalendar::test_sessions_minutes_count[left] PASSED [ 8%] tests/test_cmes_calendar.py::TestCMESCalendar::test_has_break PASSED [ 8%] tests/test_cmes_calendar.py::TestCMESCalendar::test_regular_holidays_sample PASSED [ 8%] tests/test_cmes_calendar.py::TestCMESCalendar::test_adhoc_holidays_sample PASSED [ 8%] tests/test_cmes_calendar.py::TestCMESCalendar::test_non_holidays_sample PASSED [ 8%] tests/test_cmes_calendar.py::TestCMESCalendar::test_late_opens_sample PASSED [ 8%] tests/test_cmes_calendar.py::TestCMESCalendar::test_early_closes_sample PASSED [ 8%] tests/test_cmes_calendar.py::TestCMESCalendar::test_early_closes_sample_time PASSED [ 8%] tests/test_cmes_calendar.py::TestCMESCalendar::test_early_closes_weekdays PASSED [ 8%] tests/test_cmes_calendar.py::TestCMESCalendar::test_early_closes_weekdays_time PASSED [ 8%] tests/test_cmes_calendar.py::TestCMESCalendar::test_non_early_closes_sample PASSED [ 8%] tests/test_cmes_calendar.py::TestCMESCalendar::test_non_early_closes_sample_time PASSED [ 8%] tests/test_cmes_calendar.py::TestCMESCalendar::test_late_opens PASSED [ 8%] tests/test_cmes_calendar.py::TestCMESCalendar::test_early_closes PASSED [ 8%] tests/test_cmes_calendar.py::TestCMESCalendar::test_session_open_close_break_start_end PASSED [ 8%] tests/test_cmes_calendar.py::TestCMESCalendar::test_session_has_break PASSED [ 8%] tests/test_cmes_calendar.py::TestCMESCalendar::test_next_prev_session PASSED [ 8%] tests/test_cmes_calendar.py::TestCMESCalendar::test_session_offset PASSED [ 8%] tests/test_cmes_calendar.py::TestCMESCalendar::test_is_session PASSED [ 8%] tests/test_cmes_calendar.py::TestCMESCalendar::test_date_to_session PASSED [ 8%] tests/test_cmes_calendar.py::TestCMESCalendar::test_prev_next_open_close PASSED [ 8%] tests/test_cmes_calendar.py::TestCMESCalendar::test_sessions_in_range PASSED [ 8%] tests/test_cmes_calendar.py::TestCMESCalendar::test_sessions_has_break PASSED [ 8%] tests/test_cmes_calendar.py::TestCMESCalendar::test_sessions_window PASSED [ 8%] tests/test_cmes_calendar.py::TestCMESCalendar::test_sessions_distance PASSED [ 8%] tests/test_cmes_calendar.py::TestCMESCalendar::test_trading_index FAILED [ 8%] tests/test_cmes_calendar.py::TestCMESCalendar::test_deprecated PASSED [ 8%] tests/test_exchange_calendar.py::TestCalendarRegistration::test_register_calendar PASSED [ 8%] tests/test_exchange_calendar.py::TestCalendarRegistration::test_register_calendar_type PASSED [ 8%] tests/test_exchange_calendar.py::TestCalendarRegistration::test_both_places_are_checked PASSED [ 8%] tests/test_exchange_calendar.py::TestCalendarRegistration::test_force_registration PASSED [ 8%] tests/test_exchange_calendar.py::test_default_calendars PASSED [ 8%] tests/test_exchange_calendar.py::test_days_at_time[2016-07-19-0-time_offset0-tz0-2016-07-19 9:31] PASSED [ 8%] tests/test_exchange_calendar.py::test_days_at_time[2016-07-19--1-time_offset1-tz1-2016-07-18 17:01] PASSED [ 8%] tests/test_exchange_calendar.py::test_days_at_time[2004-04-05--1-time_offset2-tz2-2004-04-04 17:01] PASSED [ 8%] tests/test_exchange_calendar.py::test_days_at_time[1990-04-02--1-time_offset3-tz3-1990-04-01 19:01] PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_testbase_integrity PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_base_integrity PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_calculated_against_csv PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_start_end PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_invalid_input PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_bound_min PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_bound_max PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_sanity_check_session_lengths PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_adhoc_holidays_specification PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_daylight_savings PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_sessions PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_opens_closes_break_starts_ends PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minutes_properties[both] PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minutes[both] PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_calendar_bounds_properties[both] PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_session_minute_methods[both] PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_session_minutes[both] PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_is_trading_minute[both] PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_is_break_minute[both] PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_is_open_on_minute[both] PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_is_open_at_time[both] PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_prev_next_minute[both] PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_to_session[both-next] PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_to_trading_minute[both-next] PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_to_session[left-next] PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_to_trading_minute[left-next] PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minutes_properties[left] PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minutes[left] PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_calendar_bounds_properties[left] PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_session_minute_methods[left] PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_session_minutes[left] PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_is_trading_minute[left] PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_is_break_minute[left] PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_is_open_on_minute[left] PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_is_open_at_time[left] PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_prev_next_minute[left] PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_to_session[left-previous] PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_to_trading_minute[left-previous] PASSED [ 8%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_to_session[both-previous] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_to_trading_minute[both-previous] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_to_session[right-previous] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_to_trading_minute[right-previous] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_to_session[right-next] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_to_trading_minute[right-next] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minutes_properties[right] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minutes[right] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_calendar_bounds_properties[right] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_session_minute_methods[right] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_session_minutes[right] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_is_trading_minute[right] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_is_break_minute[right] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_is_open_on_minute[right] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_is_open_at_time[right] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_prev_next_minute[right] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_to_session[right-none] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_to_trading_minute[right-none] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_to_session[left-none] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_to_trading_minute[left-none] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_to_session[both-none] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_to_trading_minute[both-none] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_to_session[neither-none] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_to_trading_minute[neither-none] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_to_session[neither-previous] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_to_session[neither-next] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_to_trading_minute[neither-next] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minutes_properties[neither] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minutes[neither] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_calendar_bounds_properties[neither] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_session_minute_methods[neither] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_session_minutes[neither] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_is_trading_minute[neither] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_is_break_minute[neither] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_is_open_on_minute[neither] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_is_open_at_time[neither] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_prev_next_minute[neither] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_to_past_session[neither] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_to_future_session[neither] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_offset[neither] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_offset_by_sessions[neither] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minutes_in_range[neither] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minutes_window[neither] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minutes_distance[neither] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minutes_to_sessions[neither] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_sessions_minutes[neither] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_sessions_minutes_count[neither] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_to_past_session[right] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_to_future_session[right] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_offset[right] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_offset_by_sessions[right] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minutes_in_range[right] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minutes_window[right] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minutes_distance[right] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minutes_to_sessions[right] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_sessions_minutes[right] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_sessions_minutes_count[right] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_to_past_session[left] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_to_future_session[left] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_offset[left] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_offset_by_sessions[left] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minutes_in_range[left] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minutes_window[left] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minutes_distance[left] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minutes_to_sessions[left] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_sessions_minutes[left] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_sessions_minutes_count[left] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_to_past_session[both] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_to_future_session[both] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_offset[both] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minute_offset_by_sessions[both] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minutes_in_range[both] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minutes_window[both] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minutes_distance[both] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_minutes_to_sessions[both] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_sessions_minutes[both] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_sessions_minutes_count[both] PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_has_break PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_regular_holidays_sample PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_adhoc_holidays_sample PASSED [ 9%] tests/test_iepa_calendar.py::TestIEPACalendar::test_non_holidays_sample PASSED [ 10%] tests/test_iepa_calendar.py::TestIEPACalendar::test_late_opens_sample PASSED [ 10%] tests/test_iepa_calendar.py::TestIEPACalendar::test_early_closes_sample PASSED [ 10%] tests/test_iepa_calendar.py::TestIEPACalendar::test_early_closes_sample_time PASSED [ 10%] tests/test_iepa_calendar.py::TestIEPACalendar::test_early_closes_weekdays PASSED [ 10%] tests/test_iepa_calendar.py::TestIEPACalendar::test_early_closes_weekdays_time PASSED [ 10%] tests/test_iepa_calendar.py::TestIEPACalendar::test_non_early_closes_sample PASSED [ 10%] tests/test_iepa_calendar.py::TestIEPACalendar::test_non_early_closes_sample_time PASSED [ 10%] tests/test_iepa_calendar.py::TestIEPACalendar::test_late_opens PASSED [ 10%] tests/test_iepa_calendar.py::TestIEPACalendar::test_early_closes PASSED [ 10%] tests/test_iepa_calendar.py::TestIEPACalendar::test_session_open_close_break_start_end PASSED [ 10%] tests/test_iepa_calendar.py::TestIEPACalendar::test_session_has_break PASSED [ 10%] tests/test_iepa_calendar.py::TestIEPACalendar::test_next_prev_session PASSED [ 10%] tests/test_iepa_calendar.py::TestIEPACalendar::test_session_offset PASSED [ 10%] tests/test_iepa_calendar.py::TestIEPACalendar::test_is_session PASSED [ 10%] tests/test_iepa_calendar.py::TestIEPACalendar::test_date_to_session PASSED [ 10%] tests/test_iepa_calendar.py::TestIEPACalendar::test_prev_next_open_close PASSED [ 10%] tests/test_iepa_calendar.py::TestIEPACalendar::test_sessions_in_range PASSED [ 10%] tests/test_iepa_calendar.py::TestIEPACalendar::test_sessions_has_break PASSED [ 10%] tests/test_iepa_calendar.py::TestIEPACalendar::test_sessions_window PASSED [ 10%] tests/test_iepa_calendar.py::TestIEPACalendar::test_sessions_distance PASSED [ 10%] tests/test_iepa_calendar.py::TestIEPACalendar::test_trading_index FAILED [ 10%] tests/test_iepa_calendar.py::TestIEPACalendar::test_deprecated PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_testbase_integrity PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_base_integrity PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_calculated_against_csv PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_start_end PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_invalid_input PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_bound_min PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_bound_max PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_sanity_check_session_lengths PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_adhoc_holidays_specification PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_daylight_savings PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_sessions PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_opens_closes_break_starts_ends PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_minutes_properties[left] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_minutes[left] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_calendar_bounds_properties[left] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_session_minute_methods[left] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_session_minutes[left] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_is_trading_minute[left] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_is_break_minute[left] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_is_open_on_minute[left] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_is_open_at_time[left] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_prev_next_minute[left] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_minute_to_session[left-next] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_minute_to_trading_minute[left-next] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_minute_to_session[right-next] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_minute_to_trading_minute[right-next] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_minutes_properties[right] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_minutes[right] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_calendar_bounds_properties[right] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_session_minute_methods[right] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_session_minutes[right] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_is_trading_minute[right] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_is_break_minute[right] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_is_open_on_minute[right] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_is_open_at_time[right] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_prev_next_minute[right] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_minute_to_session[right-previous] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_minute_to_session[left-previous] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_minute_to_session[right-none] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_minute_to_trading_minute[right-none] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_minute_to_session[left-none] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_minute_to_trading_minute[left-none] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_minute_to_past_session[right] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_minute_to_future_session[right] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_minute_offset[right] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_minute_offset_by_sessions[right] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_minutes_in_range[right] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_minutes_window[right] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_minutes_distance[right] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_minutes_to_sessions[right] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_sessions_minutes[right] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_sessions_minutes_count[right] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_minute_to_past_session[left] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_minute_to_future_session[left] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_minute_offset[left] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_minute_offset_by_sessions[left] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_minutes_in_range[left] PASSED [ 10%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_minutes_window[left] PASSED [ 11%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_minutes_distance[left] PASSED [ 11%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_minutes_to_sessions[left] PASSED [ 11%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_sessions_minutes[left] PASSED [ 11%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_sessions_minutes_count[left] PASSED [ 11%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_has_break PASSED [ 11%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_regular_holidays_sample PASSED [ 11%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_adhoc_holidays_sample PASSED [ 11%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_non_holidays_sample PASSED [ 11%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_late_opens_sample PASSED [ 11%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_early_closes_sample PASSED [ 11%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_early_closes_sample_time PASSED [ 11%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_early_closes_weekdays PASSED [ 11%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_early_closes_weekdays_time PASSED [ 11%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_non_early_closes_sample PASSED [ 11%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_non_early_closes_sample_time PASSED [ 11%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_late_opens PASSED [ 11%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_early_closes PASSED [ 11%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_session_open_close_break_start_end PASSED [ 11%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_session_has_break PASSED [ 11%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_next_prev_session PASSED [ 11%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_session_offset PASSED [ 11%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_is_session PASSED [ 11%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_date_to_session PASSED [ 11%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_prev_next_open_close PASSED [ 11%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_sessions_in_range PASSED [ 11%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_sessions_has_break PASSED [ 11%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_sessions_window PASSED [ 11%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_sessions_distance PASSED [ 11%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_trading_index FAILED [ 11%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_deprecated PASSED [ 11%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_open_every_weekday PASSED [ 11%] tests/test_weekday_calendar.py::TestWeekdayCalendar::test_open_every_weekday_minute PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_testbase_integrity PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_base_integrity PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_calculated_against_csv PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_start_end PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_invalid_input PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_bound_min PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_bound_max PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_sanity_check_session_lengths PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_adhoc_holidays_specification PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_daylight_savings PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_sessions PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_opens_closes_break_starts_ends PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minutes_properties[both] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minutes[both] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_calendar_bounds_properties[both] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_session_minute_methods[both] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_session_minutes[both] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_is_trading_minute[both] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_is_break_minute[both] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_is_open_on_minute[both] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_is_open_at_time[both] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_prev_next_minute[both] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_to_session[both-next] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_to_trading_minute[both-next] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_to_session[left-next] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_to_trading_minute[left-next] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minutes_properties[left] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minutes[left] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_calendar_bounds_properties[left] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_session_minute_methods[left] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_session_minutes[left] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_is_trading_minute[left] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_is_break_minute[left] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_is_open_on_minute[left] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_is_open_at_time[left] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_prev_next_minute[left] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_to_session[left-previous] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_to_session[both-previous] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_to_session[right-previous] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_to_session[right-next] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_to_trading_minute[right-next] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minutes_properties[right] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minutes[right] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_calendar_bounds_properties[right] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_session_minute_methods[right] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_session_minutes[right] PASSED [ 11%] tests/test_xams_calendar.py::TestXAMSCalendar::test_is_trading_minute[right] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_is_break_minute[right] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_is_open_on_minute[right] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_is_open_at_time[right] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_prev_next_minute[right] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_to_session[right-none] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_to_trading_minute[right-none] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_to_session[left-none] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_to_trading_minute[left-none] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_to_session[both-none] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_to_trading_minute[both-none] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_to_session[neither-none] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_to_session[neither-previous] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_to_session[neither-next] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minutes_properties[neither] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minutes[neither] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_calendar_bounds_properties[neither] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_session_minute_methods[neither] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_session_minutes[neither] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_is_trading_minute[neither] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_is_break_minute[neither] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_is_open_on_minute[neither] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_is_open_at_time[neither] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_prev_next_minute[neither] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_to_past_session[neither] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_to_future_session[neither] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_offset[neither] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_offset_by_sessions[neither] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minutes_in_range[neither] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minutes_window[neither] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minutes_distance[neither] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minutes_to_sessions[neither] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_sessions_minutes[neither] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_sessions_minutes_count[neither] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_to_past_session[right] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_to_future_session[right] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_offset[right] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_offset_by_sessions[right] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minutes_in_range[right] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minutes_window[right] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minutes_distance[right] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minutes_to_sessions[right] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_sessions_minutes[right] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_sessions_minutes_count[right] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_to_past_session[left] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_to_future_session[left] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_offset[left] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_offset_by_sessions[left] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minutes_in_range[left] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minutes_window[left] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minutes_distance[left] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minutes_to_sessions[left] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_sessions_minutes[left] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_sessions_minutes_count[left] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_to_past_session[both] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_to_future_session[both] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_offset[both] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minute_offset_by_sessions[both] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minutes_in_range[both] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minutes_window[both] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minutes_distance[both] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_minutes_to_sessions[both] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_sessions_minutes[both] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_sessions_minutes_count[both] PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_has_break PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_regular_holidays_sample PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_adhoc_holidays_sample PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_non_holidays_sample PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_late_opens_sample PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_early_closes_sample PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_early_closes_sample_time PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_early_closes_weekdays PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_early_closes_weekdays_time PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_non_early_closes_sample PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_non_early_closes_sample_time PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_late_opens PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_early_closes PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_session_open_close_break_start_end PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_session_has_break PASSED [ 12%] tests/test_xams_calendar.py::TestXAMSCalendar::test_next_prev_session PASSED [ 13%] tests/test_xams_calendar.py::TestXAMSCalendar::test_session_offset PASSED [ 13%] tests/test_xams_calendar.py::TestXAMSCalendar::test_is_session PASSED [ 13%] tests/test_xams_calendar.py::TestXAMSCalendar::test_date_to_session PASSED [ 13%] tests/test_xams_calendar.py::TestXAMSCalendar::test_prev_next_open_close PASSED [ 13%] tests/test_xams_calendar.py::TestXAMSCalendar::test_sessions_in_range PASSED [ 13%] tests/test_xams_calendar.py::TestXAMSCalendar::test_sessions_has_break PASSED [ 13%] tests/test_xams_calendar.py::TestXAMSCalendar::test_sessions_window PASSED [ 13%] tests/test_xams_calendar.py::TestXAMSCalendar::test_sessions_distance PASSED [ 13%] tests/test_xams_calendar.py::TestXAMSCalendar::test_trading_index FAILED [ 13%] tests/test_xams_calendar.py::TestXAMSCalendar::test_deprecated PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_testbase_integrity PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_base_integrity PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_calculated_against_csv PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_start_end PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_invalid_input PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_bound_min PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_bound_max PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_sanity_check_session_lengths PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_adhoc_holidays_specification PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_daylight_savings PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_sessions PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_opens_closes_break_starts_ends PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minutes_properties[both] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minutes[both] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_calendar_bounds_properties[both] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_session_minute_methods[both] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_session_minutes[both] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_is_trading_minute[both] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_is_break_minute[both] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_is_open_on_minute[both] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_is_open_at_time[both] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_prev_next_minute[both] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_to_session[both-next] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_to_trading_minute[both-next] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_to_session[left-next] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_to_trading_minute[left-next] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minutes_properties[left] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minutes[left] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_calendar_bounds_properties[left] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_session_minute_methods[left] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_session_minutes[left] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_is_trading_minute[left] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_is_break_minute[left] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_is_open_on_minute[left] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_is_open_at_time[left] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_prev_next_minute[left] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_to_session[left-previous] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_to_session[both-previous] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_to_session[right-previous] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_to_session[right-next] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_to_trading_minute[right-next] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minutes_properties[right] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minutes[right] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_calendar_bounds_properties[right] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_session_minute_methods[right] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_session_minutes[right] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_is_trading_minute[right] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_is_break_minute[right] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_is_open_on_minute[right] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_is_open_at_time[right] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_prev_next_minute[right] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_to_session[right-none] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_to_trading_minute[right-none] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_to_session[left-none] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_to_trading_minute[left-none] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_to_session[both-none] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_to_trading_minute[both-none] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_to_session[neither-none] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_to_session[neither-previous] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_to_session[neither-next] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minutes_properties[neither] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minutes[neither] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_calendar_bounds_properties[neither] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_session_minute_methods[neither] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_session_minutes[neither] PASSED [ 13%] tests/test_xasx_calendar.py::TestXASXCalendar::test_is_trading_minute[neither] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_is_break_minute[neither] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_is_open_on_minute[neither] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_is_open_at_time[neither] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_prev_next_minute[neither] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_to_past_session[neither] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_to_future_session[neither] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_offset[neither] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_offset_by_sessions[neither] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minutes_in_range[neither] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minutes_window[neither] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minutes_distance[neither] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minutes_to_sessions[neither] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_sessions_minutes[neither] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_sessions_minutes_count[neither] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_to_past_session[right] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_to_future_session[right] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_offset[right] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_offset_by_sessions[right] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minutes_in_range[right] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minutes_window[right] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minutes_distance[right] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minutes_to_sessions[right] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_sessions_minutes[right] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_sessions_minutes_count[right] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_to_past_session[left] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_to_future_session[left] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_offset[left] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_offset_by_sessions[left] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minutes_in_range[left] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minutes_window[left] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minutes_distance[left] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minutes_to_sessions[left] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_sessions_minutes[left] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_sessions_minutes_count[left] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_to_past_session[both] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_to_future_session[both] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_offset[both] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minute_offset_by_sessions[both] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minutes_in_range[both] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minutes_window[both] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minutes_distance[both] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_minutes_to_sessions[both] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_sessions_minutes[both] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_sessions_minutes_count[both] PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_has_break PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_regular_holidays_sample PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_adhoc_holidays_sample PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_non_holidays_sample PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_late_opens_sample PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_early_closes_sample PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_early_closes_sample_time PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_early_closes_weekdays PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_early_closes_weekdays_time PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_non_early_closes_sample PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_non_early_closes_sample_time PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_late_opens PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_early_closes PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_session_open_close_break_start_end PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_session_has_break PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_next_prev_session PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_session_offset PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_is_session PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_date_to_session PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_prev_next_open_close PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_sessions_in_range PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_sessions_has_break PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_sessions_window PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_sessions_distance PASSED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_trading_index FAILED [ 14%] tests/test_xasx_calendar.py::TestXASXCalendar::test_deprecated PASSED [ 14%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_testbase_integrity PASSED [ 14%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_base_integrity PASSED [ 14%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_calculated_against_csv PASSED [ 14%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_start_end PASSED [ 14%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_invalid_input PASSED [ 14%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_bound_min PASSED [ 14%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_bound_max PASSED [ 14%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_sanity_check_session_lengths PASSED [ 14%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_adhoc_holidays_specification PASSED [ 14%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_daylight_savings PASSED [ 14%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_sessions PASSED [ 14%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_opens_closes_break_starts_ends PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minutes_properties[both] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minutes[both] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_calendar_bounds_properties[both] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_session_minute_methods[both] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_session_minutes[both] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_is_trading_minute[both] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_is_break_minute[both] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_is_open_on_minute[both] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_is_open_at_time[both] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_prev_next_minute[both] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_to_session[both-next] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_to_trading_minute[both-next] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_to_session[left-next] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_to_trading_minute[left-next] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minutes_properties[left] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minutes[left] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_calendar_bounds_properties[left] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_session_minute_methods[left] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_session_minutes[left] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_is_trading_minute[left] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_is_break_minute[left] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_is_open_on_minute[left] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_is_open_at_time[left] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_prev_next_minute[left] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_to_session[left-previous] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_to_session[both-previous] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_to_session[right-previous] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_to_session[right-next] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_to_trading_minute[right-next] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minutes_properties[right] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minutes[right] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_calendar_bounds_properties[right] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_session_minute_methods[right] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_session_minutes[right] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_is_trading_minute[right] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_is_break_minute[right] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_is_open_on_minute[right] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_is_open_at_time[right] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_prev_next_minute[right] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_to_session[right-none] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_to_trading_minute[right-none] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_to_session[left-none] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_to_trading_minute[left-none] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_to_session[both-none] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_to_trading_minute[both-none] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_to_session[neither-none] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_to_session[neither-previous] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_to_session[neither-next] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minutes_properties[neither] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minutes[neither] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_calendar_bounds_properties[neither] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_session_minute_methods[neither] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_session_minutes[neither] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_is_trading_minute[neither] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_is_break_minute[neither] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_is_open_on_minute[neither] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_is_open_at_time[neither] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_prev_next_minute[neither] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_to_past_session[neither] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_to_future_session[neither] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_offset[neither] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_offset_by_sessions[neither] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minutes_in_range[neither] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minutes_window[neither] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minutes_distance[neither] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minutes_to_sessions[neither] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_sessions_minutes[neither] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_sessions_minutes_count[neither] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_to_past_session[right] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_to_future_session[right] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_offset[right] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_offset_by_sessions[right] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minutes_in_range[right] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minutes_window[right] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minutes_distance[right] PASSED [ 15%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minutes_to_sessions[right] PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_sessions_minutes[right] PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_sessions_minutes_count[right] PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_to_past_session[left] PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_to_future_session[left] PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_offset[left] PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_offset_by_sessions[left] PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minutes_in_range[left] PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minutes_window[left] PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minutes_distance[left] PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minutes_to_sessions[left] PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_sessions_minutes[left] PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_sessions_minutes_count[left] PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_to_past_session[both] PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_to_future_session[both] PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_offset[both] PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minute_offset_by_sessions[both] PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minutes_in_range[both] PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minutes_window[both] PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minutes_distance[both] PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_minutes_to_sessions[both] PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_sessions_minutes[both] PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_sessions_minutes_count[both] PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_has_break PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_regular_holidays_sample PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_adhoc_holidays_sample PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_non_holidays_sample PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_late_opens_sample PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_early_closes_sample PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_early_closes_sample_time PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_early_closes_weekdays PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_early_closes_weekdays_time PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_non_early_closes_sample PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_non_early_closes_sample_time PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_late_opens PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_early_closes PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_session_open_close_break_start_end PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_session_has_break PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_next_prev_session PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_session_offset PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_is_session PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_date_to_session PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_prev_next_open_close PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_sessions_in_range PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_sessions_has_break PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_sessions_window PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_sessions_distance PASSED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_trading_index FAILED [ 16%] tests/test_xbkk_calendar.py::TestXBKKCalendar::test_deprecated PASSED [ 16%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_testbase_integrity PASSED [ 16%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_base_integrity PASSED [ 16%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_calculated_against_csv PASSED [ 16%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_start_end PASSED [ 16%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_invalid_input PASSED [ 16%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_bound_min PASSED [ 16%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_bound_max PASSED [ 16%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_sanity_check_session_lengths PASSED [ 16%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_adhoc_holidays_specification PASSED [ 16%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_daylight_savings PASSED [ 16%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_sessions PASSED [ 16%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_opens_closes_break_starts_ends PASSED [ 16%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minutes_properties[both] PASSED [ 16%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minutes[both] PASSED [ 16%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_calendar_bounds_properties[both] PASSED [ 16%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_session_minute_methods[both] PASSED [ 16%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_session_minutes[both] PASSED [ 16%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_is_trading_minute[both] PASSED [ 16%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_is_break_minute[both] PASSED [ 16%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_is_open_on_minute[both] PASSED [ 16%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_is_open_at_time[both] PASSED [ 16%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_prev_next_minute[both] PASSED [ 16%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_to_session[both-next] PASSED [ 16%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_to_trading_minute[both-next] PASSED [ 16%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_to_session[left-next] PASSED [ 16%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_to_trading_minute[left-next] PASSED [ 16%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minutes_properties[left] PASSED [ 16%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minutes[left] PASSED [ 16%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_calendar_bounds_properties[left] PASSED [ 16%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_session_minute_methods[left] PASSED [ 16%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_session_minutes[left] PASSED [ 16%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_is_trading_minute[left] PASSED [ 16%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_is_break_minute[left] PASSED [ 16%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_is_open_on_minute[left] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_is_open_at_time[left] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_prev_next_minute[left] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_to_session[left-previous] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_to_session[both-previous] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_to_session[right-previous] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_to_session[right-next] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_to_trading_minute[right-next] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minutes_properties[right] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minutes[right] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_calendar_bounds_properties[right] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_session_minute_methods[right] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_session_minutes[right] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_is_trading_minute[right] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_is_break_minute[right] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_is_open_on_minute[right] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_is_open_at_time[right] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_prev_next_minute[right] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_to_session[right-none] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_to_trading_minute[right-none] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_to_session[left-none] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_to_trading_minute[left-none] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_to_session[both-none] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_to_trading_minute[both-none] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_to_session[neither-none] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_to_session[neither-previous] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_to_session[neither-next] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minutes_properties[neither] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minutes[neither] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_calendar_bounds_properties[neither] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_session_minute_methods[neither] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_session_minutes[neither] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_is_trading_minute[neither] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_is_break_minute[neither] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_is_open_on_minute[neither] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_is_open_at_time[neither] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_prev_next_minute[neither] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_to_past_session[neither] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_to_future_session[neither] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_offset[neither] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_offset_by_sessions[neither] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minutes_in_range[neither] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minutes_window[neither] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minutes_distance[neither] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minutes_to_sessions[neither] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_sessions_minutes[neither] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_sessions_minutes_count[neither] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_to_past_session[right] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_to_future_session[right] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_offset[right] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_offset_by_sessions[right] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minutes_in_range[right] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minutes_window[right] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minutes_distance[right] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minutes_to_sessions[right] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_sessions_minutes[right] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_sessions_minutes_count[right] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_to_past_session[left] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_to_future_session[left] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_offset[left] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_offset_by_sessions[left] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minutes_in_range[left] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minutes_window[left] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minutes_distance[left] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minutes_to_sessions[left] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_sessions_minutes[left] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_sessions_minutes_count[left] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_to_past_session[both] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_to_future_session[both] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_offset[both] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minute_offset_by_sessions[both] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minutes_in_range[both] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minutes_window[both] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minutes_distance[both] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_minutes_to_sessions[both] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_sessions_minutes[both] PASSED [ 17%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_sessions_minutes_count[both] PASSED [ 18%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_has_break PASSED [ 18%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_regular_holidays_sample PASSED [ 18%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_adhoc_holidays_sample PASSED [ 18%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_non_holidays_sample PASSED [ 18%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_late_opens_sample PASSED [ 18%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_early_closes_sample PASSED [ 18%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_early_closes_sample_time PASSED [ 18%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_early_closes_weekdays PASSED [ 18%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_early_closes_weekdays_time PASSED [ 18%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_non_early_closes_sample PASSED [ 18%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_non_early_closes_sample_time PASSED [ 18%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_late_opens PASSED [ 18%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_early_closes PASSED [ 18%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_session_open_close_break_start_end PASSED [ 18%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_session_has_break PASSED [ 18%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_next_prev_session PASSED [ 18%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_session_offset PASSED [ 18%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_is_session PASSED [ 18%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_date_to_session PASSED [ 18%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_prev_next_open_close PASSED [ 18%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_sessions_in_range PASSED [ 18%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_sessions_has_break PASSED [ 18%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_sessions_window PASSED [ 18%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_sessions_distance PASSED [ 18%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_trading_index FAILED [ 18%] tests/test_xbog_calendar.py::TestXBOGCalendar::test_deprecated PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_testbase_integrity PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_base_integrity PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_calculated_against_csv PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_start_end PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_invalid_input PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_bound_min PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_bound_max PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_sanity_check_session_lengths PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_adhoc_holidays_specification PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_daylight_savings PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_sessions PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_opens_closes_break_starts_ends PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minutes_properties[both] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minutes[both] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_calendar_bounds_properties[both] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_session_minute_methods[both] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_session_minutes[both] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_is_trading_minute[both] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_is_break_minute[both] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_is_open_on_minute[both] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_is_open_at_time[both] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_prev_next_minute[both] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_to_session[both-next] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_to_trading_minute[both-next] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_to_session[left-next] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_to_trading_minute[left-next] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minutes_properties[left] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minutes[left] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_calendar_bounds_properties[left] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_session_minute_methods[left] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_session_minutes[left] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_is_trading_minute[left] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_is_break_minute[left] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_is_open_on_minute[left] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_is_open_at_time[left] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_prev_next_minute[left] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_to_session[left-previous] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_to_session[both-previous] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_to_session[right-previous] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_to_session[right-next] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_to_trading_minute[right-next] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minutes_properties[right] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minutes[right] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_calendar_bounds_properties[right] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_session_minute_methods[right] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_session_minutes[right] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_is_trading_minute[right] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_is_break_minute[right] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_is_open_on_minute[right] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_is_open_at_time[right] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_prev_next_minute[right] PASSED [ 18%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_to_session[right-none] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_to_trading_minute[right-none] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_to_session[left-none] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_to_trading_minute[left-none] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_to_session[both-none] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_to_trading_minute[both-none] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_to_session[neither-none] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_to_session[neither-previous] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_to_session[neither-next] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minutes_properties[neither] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minutes[neither] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_calendar_bounds_properties[neither] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_session_minute_methods[neither] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_session_minutes[neither] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_is_trading_minute[neither] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_is_break_minute[neither] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_is_open_on_minute[neither] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_is_open_at_time[neither] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_prev_next_minute[neither] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_to_past_session[neither] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_to_future_session[neither] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_offset[neither] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_offset_by_sessions[neither] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minutes_in_range[neither] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minutes_window[neither] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minutes_distance[neither] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minutes_to_sessions[neither] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_sessions_minutes[neither] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_sessions_minutes_count[neither] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_to_past_session[right] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_to_future_session[right] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_offset[right] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_offset_by_sessions[right] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minutes_in_range[right] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minutes_window[right] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minutes_distance[right] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minutes_to_sessions[right] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_sessions_minutes[right] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_sessions_minutes_count[right] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_to_past_session[left] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_to_future_session[left] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_offset[left] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_offset_by_sessions[left] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minutes_in_range[left] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minutes_window[left] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minutes_distance[left] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minutes_to_sessions[left] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_sessions_minutes[left] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_sessions_minutes_count[left] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_to_past_session[both] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_to_future_session[both] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_offset[both] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minute_offset_by_sessions[both] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minutes_in_range[both] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minutes_window[both] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minutes_distance[both] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_minutes_to_sessions[both] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_sessions_minutes[both] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_sessions_minutes_count[both] PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_has_break PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_regular_holidays_sample PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_adhoc_holidays_sample PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_non_holidays_sample PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_late_opens_sample PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_early_closes_sample PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_early_closes_sample_time PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_early_closes_weekdays PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_early_closes_weekdays_time PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_non_early_closes_sample PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_non_early_closes_sample_time PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_late_opens PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_early_closes PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_session_open_close_break_start_end PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_session_has_break PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_next_prev_session PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_session_offset PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_is_session PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_date_to_session PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_prev_next_open_close PASSED [ 19%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_sessions_in_range PASSED [ 20%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_sessions_has_break PASSED [ 20%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_sessions_window PASSED [ 20%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_sessions_distance PASSED [ 20%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_trading_index FAILED [ 20%] tests/test_xbom_calendar.py::TestXBOMCalendar::test_deprecated PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_testbase_integrity PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_base_integrity PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_calculated_against_csv PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_start_end PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_invalid_input PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_bound_min PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_bound_max PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_sanity_check_session_lengths PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_adhoc_holidays_specification PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_daylight_savings PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_sessions PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_opens_closes_break_starts_ends PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minutes_properties[both] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minutes[both] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_calendar_bounds_properties[both] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_session_minute_methods[both] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_session_minutes[both] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_is_trading_minute[both] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_is_break_minute[both] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_is_open_on_minute[both] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_is_open_at_time[both] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_prev_next_minute[both] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_to_session[both-next] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_to_trading_minute[both-next] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_to_session[left-next] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_to_trading_minute[left-next] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minutes_properties[left] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minutes[left] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_calendar_bounds_properties[left] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_session_minute_methods[left] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_session_minutes[left] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_is_trading_minute[left] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_is_break_minute[left] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_is_open_on_minute[left] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_is_open_at_time[left] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_prev_next_minute[left] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_to_session[left-previous] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_to_session[both-previous] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_to_session[right-previous] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_to_session[right-next] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_to_trading_minute[right-next] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minutes_properties[right] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minutes[right] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_calendar_bounds_properties[right] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_session_minute_methods[right] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_session_minutes[right] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_is_trading_minute[right] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_is_break_minute[right] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_is_open_on_minute[right] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_is_open_at_time[right] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_prev_next_minute[right] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_to_session[right-none] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_to_trading_minute[right-none] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_to_session[left-none] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_to_trading_minute[left-none] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_to_session[both-none] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_to_trading_minute[both-none] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_to_session[neither-none] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_to_session[neither-previous] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_to_session[neither-next] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minutes_properties[neither] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minutes[neither] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_calendar_bounds_properties[neither] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_session_minute_methods[neither] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_session_minutes[neither] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_is_trading_minute[neither] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_is_break_minute[neither] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_is_open_on_minute[neither] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_is_open_at_time[neither] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_prev_next_minute[neither] PASSED [ 20%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_to_past_session[neither] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_to_future_session[neither] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_offset[neither] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_offset_by_sessions[neither] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minutes_in_range[neither] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minutes_window[neither] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minutes_distance[neither] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minutes_to_sessions[neither] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_sessions_minutes[neither] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_sessions_minutes_count[neither] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_to_past_session[right] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_to_future_session[right] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_offset[right] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_offset_by_sessions[right] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minutes_in_range[right] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minutes_window[right] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minutes_distance[right] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minutes_to_sessions[right] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_sessions_minutes[right] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_sessions_minutes_count[right] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_to_past_session[left] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_to_future_session[left] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_offset[left] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_offset_by_sessions[left] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minutes_in_range[left] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minutes_window[left] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minutes_distance[left] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minutes_to_sessions[left] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_sessions_minutes[left] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_sessions_minutes_count[left] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_to_past_session[both] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_to_future_session[both] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_offset[both] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minute_offset_by_sessions[both] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minutes_in_range[both] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minutes_window[both] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minutes_distance[both] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_minutes_to_sessions[both] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_sessions_minutes[both] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_sessions_minutes_count[both] PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_has_break PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_regular_holidays_sample PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_adhoc_holidays_sample PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_non_holidays_sample PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_late_opens_sample PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_early_closes_sample PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_early_closes_sample_time PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_early_closes_weekdays PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_early_closes_weekdays_time PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_non_early_closes_sample PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_non_early_closes_sample_time PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_late_opens PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_early_closes PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_session_open_close_break_start_end PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_session_has_break PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_next_prev_session PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_session_offset PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_is_session PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_date_to_session PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_prev_next_open_close PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_sessions_in_range PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_sessions_has_break PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_sessions_window PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_sessions_distance PASSED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_trading_index FAILED [ 21%] tests/test_xbru_calendar.py::TestXBRUCalendar::test_deprecated PASSED [ 21%] tests/test_xbse_calendar.py::TestXBSECalendar::test_testbase_integrity PASSED [ 21%] tests/test_xbse_calendar.py::TestXBSECalendar::test_base_integrity PASSED [ 21%] tests/test_xbse_calendar.py::TestXBSECalendar::test_calculated_against_csv PASSED [ 21%] tests/test_xbse_calendar.py::TestXBSECalendar::test_start_end PASSED [ 21%] tests/test_xbse_calendar.py::TestXBSECalendar::test_invalid_input PASSED [ 21%] tests/test_xbse_calendar.py::TestXBSECalendar::test_bound_min PASSED [ 21%] tests/test_xbse_calendar.py::TestXBSECalendar::test_bound_max PASSED [ 21%] tests/test_xbse_calendar.py::TestXBSECalendar::test_sanity_check_session_lengths PASSED [ 21%] tests/test_xbse_calendar.py::TestXBSECalendar::test_adhoc_holidays_specification PASSED [ 21%] tests/test_xbse_calendar.py::TestXBSECalendar::test_daylight_savings PASSED [ 21%] tests/test_xbse_calendar.py::TestXBSECalendar::test_sessions PASSED [ 21%] tests/test_xbse_calendar.py::TestXBSECalendar::test_opens_closes_break_starts_ends PASSED [ 21%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minutes_properties[both] PASSED [ 21%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minutes[both] PASSED [ 21%] tests/test_xbse_calendar.py::TestXBSECalendar::test_calendar_bounds_properties[both] PASSED [ 21%] tests/test_xbse_calendar.py::TestXBSECalendar::test_session_minute_methods[both] PASSED [ 21%] tests/test_xbse_calendar.py::TestXBSECalendar::test_session_minutes[both] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_is_trading_minute[both] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_is_break_minute[both] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_is_open_on_minute[both] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_is_open_at_time[both] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_prev_next_minute[both] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_to_session[both-next] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_to_trading_minute[both-next] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_to_session[left-next] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_to_trading_minute[left-next] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minutes_properties[left] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minutes[left] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_calendar_bounds_properties[left] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_session_minute_methods[left] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_session_minutes[left] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_is_trading_minute[left] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_is_break_minute[left] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_is_open_on_minute[left] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_is_open_at_time[left] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_prev_next_minute[left] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_to_session[left-previous] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_to_trading_minute[left-previous] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_to_session[both-previous] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_to_trading_minute[both-previous] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_to_session[right-previous] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_to_trading_minute[right-previous] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_to_session[right-next] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_to_trading_minute[right-next] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minutes_properties[right] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minutes[right] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_calendar_bounds_properties[right] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_session_minute_methods[right] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_session_minutes[right] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_is_trading_minute[right] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_is_break_minute[right] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_is_open_on_minute[right] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_is_open_at_time[right] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_prev_next_minute[right] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_to_session[right-none] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_to_trading_minute[right-none] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_to_session[left-none] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_to_trading_minute[left-none] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_to_session[both-none] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_to_trading_minute[both-none] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_to_session[neither-none] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_to_trading_minute[neither-none] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_to_session[neither-previous] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_to_session[neither-next] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_to_trading_minute[neither-next] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minutes_properties[neither] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minutes[neither] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_calendar_bounds_properties[neither] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_session_minute_methods[neither] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_session_minutes[neither] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_is_trading_minute[neither] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_is_break_minute[neither] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_is_open_on_minute[neither] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_is_open_at_time[neither] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_prev_next_minute[neither] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_to_past_session[neither] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_to_future_session[neither] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_offset[neither] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_offset_by_sessions[neither] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minutes_in_range[neither] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minutes_window[neither] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minutes_distance[neither] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minutes_to_sessions[neither] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_sessions_minutes[neither] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_sessions_minutes_count[neither] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_to_past_session[right] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_to_future_session[right] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_offset[right] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_offset_by_sessions[right] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minutes_in_range[right] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minutes_window[right] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minutes_distance[right] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minutes_to_sessions[right] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_sessions_minutes[right] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_sessions_minutes_count[right] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_to_past_session[left] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_to_future_session[left] PASSED [ 22%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_offset[left] PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_offset_by_sessions[left] PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minutes_in_range[left] PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minutes_window[left] PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minutes_distance[left] PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minutes_to_sessions[left] PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_sessions_minutes[left] PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_sessions_minutes_count[left] PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_to_past_session[both] PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_to_future_session[both] PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_offset[both] PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minute_offset_by_sessions[both] PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minutes_in_range[both] PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minutes_window[both] PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minutes_distance[both] PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_minutes_to_sessions[both] PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_sessions_minutes[both] PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_sessions_minutes_count[both] PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_has_break PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_regular_holidays_sample PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_adhoc_holidays_sample PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_non_holidays_sample PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_late_opens_sample PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_early_closes_sample PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_early_closes_sample_time PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_early_closes_weekdays PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_early_closes_weekdays_time PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_non_early_closes_sample PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_non_early_closes_sample_time PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_late_opens PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_early_closes PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_session_open_close_break_start_end PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_session_has_break PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_next_prev_session PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_session_offset PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_is_session PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_date_to_session PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_prev_next_open_close PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_sessions_in_range PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_sessions_has_break PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_sessions_window PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_sessions_distance PASSED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_trading_index FAILED [ 23%] tests/test_xbse_calendar.py::TestXBSECalendar::test_deprecated PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_testbase_integrity PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_base_integrity PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_calculated_against_csv PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_start_end PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_invalid_input PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_bound_min PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_bound_max PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_sanity_check_session_lengths PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_adhoc_holidays_specification PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_daylight_savings PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_sessions PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_opens_closes_break_starts_ends PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minutes_properties[both] PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minutes[both] PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_calendar_bounds_properties[both] PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_session_minute_methods[both] PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_session_minutes[both] PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_is_trading_minute[both] PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_is_break_minute[both] PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_is_open_on_minute[both] PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_is_open_at_time[both] PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_prev_next_minute[both] PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_to_session[both-next] PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_to_trading_minute[both-next] PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_to_session[left-next] PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_to_trading_minute[left-next] PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minutes_properties[left] PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minutes[left] PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_calendar_bounds_properties[left] PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_session_minute_methods[left] PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_session_minutes[left] PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_is_trading_minute[left] PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_is_break_minute[left] PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_is_open_on_minute[left] PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_is_open_at_time[left] PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_prev_next_minute[left] PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_to_session[left-previous] PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 23%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_to_session[both-previous] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_to_session[right-previous] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_to_session[right-next] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_to_trading_minute[right-next] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minutes_properties[right] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minutes[right] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_calendar_bounds_properties[right] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_session_minute_methods[right] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_session_minutes[right] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_is_trading_minute[right] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_is_break_minute[right] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_is_open_on_minute[right] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_is_open_at_time[right] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_prev_next_minute[right] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_to_session[right-none] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_to_trading_minute[right-none] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_to_session[left-none] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_to_trading_minute[left-none] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_to_session[both-none] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_to_trading_minute[both-none] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_to_session[neither-none] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_to_session[neither-previous] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_to_session[neither-next] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minutes_properties[neither] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minutes[neither] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_calendar_bounds_properties[neither] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_session_minute_methods[neither] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_session_minutes[neither] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_is_trading_minute[neither] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_is_break_minute[neither] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_is_open_on_minute[neither] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_is_open_at_time[neither] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_prev_next_minute[neither] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_to_past_session[neither] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_to_future_session[neither] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_offset[neither] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_offset_by_sessions[neither] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minutes_in_range[neither] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minutes_window[neither] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minutes_distance[neither] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minutes_to_sessions[neither] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_sessions_minutes[neither] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_sessions_minutes_count[neither] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_to_past_session[right] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_to_future_session[right] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_offset[right] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_offset_by_sessions[right] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minutes_in_range[right] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minutes_window[right] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minutes_distance[right] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minutes_to_sessions[right] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_sessions_minutes[right] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_sessions_minutes_count[right] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_to_past_session[left] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_to_future_session[left] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_offset[left] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_offset_by_sessions[left] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minutes_in_range[left] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minutes_window[left] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minutes_distance[left] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minutes_to_sessions[left] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_sessions_minutes[left] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_sessions_minutes_count[left] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_to_past_session[both] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_to_future_session[both] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_offset[both] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minute_offset_by_sessions[both] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minutes_in_range[both] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minutes_window[both] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minutes_distance[both] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_minutes_to_sessions[both] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_sessions_minutes[both] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_sessions_minutes_count[both] PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_has_break PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_regular_holidays_sample PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_adhoc_holidays_sample PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_non_holidays_sample PASSED [ 24%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_late_opens_sample PASSED [ 25%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_early_closes_sample PASSED [ 25%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_early_closes_sample_time PASSED [ 25%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_early_closes_weekdays PASSED [ 25%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_early_closes_weekdays_time PASSED [ 25%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_non_early_closes_sample PASSED [ 25%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_non_early_closes_sample_time PASSED [ 25%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_late_opens PASSED [ 25%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_early_closes PASSED [ 25%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_session_open_close_break_start_end PASSED [ 25%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_session_has_break PASSED [ 25%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_next_prev_session PASSED [ 25%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_session_offset PASSED [ 25%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_is_session PASSED [ 25%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_date_to_session PASSED [ 25%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_prev_next_open_close PASSED [ 25%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_sessions_in_range PASSED [ 25%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_sessions_has_break PASSED [ 25%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_sessions_window PASSED [ 25%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_sessions_distance PASSED [ 25%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_trading_index FAILED [ 25%] tests/test_xbud_calendar.py::TestXBUDCalendar::test_deprecated PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_testbase_integrity PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_base_integrity PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_calculated_against_csv PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_start_end PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_invalid_input PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_bound_min PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_bound_max PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_sanity_check_session_lengths PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_adhoc_holidays_specification PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_daylight_savings PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_sessions PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_opens_closes_break_starts_ends PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minutes_properties[both] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minutes[both] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_calendar_bounds_properties[both] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_session_minute_methods[both] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_session_minutes[both] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_is_trading_minute[both] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_is_break_minute[both] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_is_open_on_minute[both] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_is_open_at_time[both] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_prev_next_minute[both] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_to_session[both-next] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_to_trading_minute[both-next] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_to_session[left-next] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_to_trading_minute[left-next] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minutes_properties[left] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minutes[left] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_calendar_bounds_properties[left] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_session_minute_methods[left] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_session_minutes[left] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_is_trading_minute[left] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_is_break_minute[left] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_is_open_on_minute[left] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_is_open_at_time[left] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_prev_next_minute[left] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_to_session[left-previous] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_to_trading_minute[left-previous] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_to_session[both-previous] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_to_trading_minute[both-previous] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_to_session[right-previous] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_to_trading_minute[right-previous] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_to_session[right-next] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_to_trading_minute[right-next] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minutes_properties[right] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minutes[right] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_calendar_bounds_properties[right] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_session_minute_methods[right] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_session_minutes[right] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_is_trading_minute[right] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_is_break_minute[right] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_is_open_on_minute[right] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_is_open_at_time[right] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_prev_next_minute[right] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_to_session[right-none] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_to_trading_minute[right-none] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_to_session[left-none] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_to_trading_minute[left-none] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_to_session[both-none] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_to_trading_minute[both-none] PASSED [ 25%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_to_session[neither-none] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_to_trading_minute[neither-none] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_to_session[neither-previous] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_to_session[neither-next] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_to_trading_minute[neither-next] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minutes_properties[neither] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minutes[neither] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_calendar_bounds_properties[neither] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_session_minute_methods[neither] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_session_minutes[neither] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_is_trading_minute[neither] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_is_break_minute[neither] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_is_open_on_minute[neither] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_is_open_at_time[neither] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_prev_next_minute[neither] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_to_past_session[neither] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_to_future_session[neither] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_offset[neither] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_offset_by_sessions[neither] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minutes_in_range[neither] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minutes_window[neither] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minutes_distance[neither] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minutes_to_sessions[neither] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_sessions_minutes[neither] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_sessions_minutes_count[neither] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_to_past_session[right] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_to_future_session[right] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_offset[right] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_offset_by_sessions[right] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minutes_in_range[right] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minutes_window[right] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minutes_distance[right] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minutes_to_sessions[right] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_sessions_minutes[right] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_sessions_minutes_count[right] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_to_past_session[left] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_to_future_session[left] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_offset[left] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_offset_by_sessions[left] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minutes_in_range[left] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minutes_window[left] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minutes_distance[left] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minutes_to_sessions[left] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_sessions_minutes[left] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_sessions_minutes_count[left] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_to_past_session[both] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_to_future_session[both] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_offset[both] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minute_offset_by_sessions[both] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minutes_in_range[both] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minutes_window[both] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minutes_distance[both] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_minutes_to_sessions[both] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_sessions_minutes[both] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_sessions_minutes_count[both] PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_has_break PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_regular_holidays_sample PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_adhoc_holidays_sample PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_non_holidays_sample PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_late_opens_sample PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_early_closes_sample PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_early_closes_sample_time PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_early_closes_weekdays PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_early_closes_weekdays_time PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_non_early_closes_sample PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_non_early_closes_sample_time PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_late_opens PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_early_closes PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_session_open_close_break_start_end PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_session_has_break PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_next_prev_session PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_session_offset PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_is_session PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_date_to_session PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_prev_next_open_close PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_sessions_in_range PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_sessions_has_break PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_sessions_window PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_sessions_distance PASSED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_trading_index FAILED [ 26%] tests/test_xbue_calendar.py::TestXBUECalendar::test_deprecated PASSED [ 26%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_testbase_integrity PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_base_integrity PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_calculated_against_csv PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_start_end PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_invalid_input PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_bound_min PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_bound_max PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_sanity_check_session_lengths PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_adhoc_holidays_specification PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_daylight_savings PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_sessions PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_opens_closes_break_starts_ends PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minutes_properties[both] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minutes[both] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_calendar_bounds_properties[both] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_session_minute_methods[both] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_session_minutes[both] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_is_trading_minute[both] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_is_break_minute[both] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_is_open_on_minute[both] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_is_open_at_time[both] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_prev_next_minute[both] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_to_session[both-next] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_to_trading_minute[both-next] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_to_session[left-next] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_to_trading_minute[left-next] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minutes_properties[left] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minutes[left] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_calendar_bounds_properties[left] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_session_minute_methods[left] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_session_minutes[left] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_is_trading_minute[left] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_is_break_minute[left] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_is_open_on_minute[left] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_is_open_at_time[left] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_prev_next_minute[left] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_to_session[left-previous] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_to_session[both-previous] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_to_session[right-previous] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_to_session[right-next] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_to_trading_minute[right-next] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minutes_properties[right] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minutes[right] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_calendar_bounds_properties[right] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_session_minute_methods[right] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_session_minutes[right] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_is_trading_minute[right] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_is_break_minute[right] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_is_open_on_minute[right] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_is_open_at_time[right] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_prev_next_minute[right] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_to_session[right-none] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_to_trading_minute[right-none] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_to_session[left-none] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_to_trading_minute[left-none] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_to_session[both-none] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_to_trading_minute[both-none] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_to_session[neither-none] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_to_session[neither-previous] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_to_session[neither-next] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minutes_properties[neither] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minutes[neither] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_calendar_bounds_properties[neither] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_session_minute_methods[neither] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_session_minutes[neither] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_is_trading_minute[neither] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_is_break_minute[neither] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_is_open_on_minute[neither] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_is_open_at_time[neither] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_prev_next_minute[neither] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_to_past_session[neither] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_to_future_session[neither] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_offset[neither] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_offset_by_sessions[neither] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minutes_in_range[neither] PASSED [ 27%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minutes_window[neither] PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minutes_distance[neither] PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minutes_to_sessions[neither] PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_sessions_minutes[neither] PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_sessions_minutes_count[neither] PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_to_past_session[right] PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_to_future_session[right] PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_offset[right] PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_offset_by_sessions[right] PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minutes_in_range[right] PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minutes_window[right] PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minutes_distance[right] PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minutes_to_sessions[right] PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_sessions_minutes[right] PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_sessions_minutes_count[right] PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_to_past_session[left] PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_to_future_session[left] PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_offset[left] PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_offset_by_sessions[left] PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minutes_in_range[left] PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minutes_window[left] PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minutes_distance[left] PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minutes_to_sessions[left] PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_sessions_minutes[left] PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_sessions_minutes_count[left] PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_to_past_session[both] PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_to_future_session[both] PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_offset[both] PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minute_offset_by_sessions[both] PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minutes_in_range[both] PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minutes_window[both] PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minutes_distance[both] PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_minutes_to_sessions[both] PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_sessions_minutes[both] PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_sessions_minutes_count[both] PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_has_break PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_regular_holidays_sample PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_adhoc_holidays_sample PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_non_holidays_sample PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_late_opens_sample PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_early_closes_sample PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_early_closes_sample_time PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_early_closes_weekdays PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_early_closes_weekdays_time PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_non_early_closes_sample PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_non_early_closes_sample_time PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_late_opens PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_early_closes PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_session_open_close_break_start_end PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_session_has_break PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_next_prev_session PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_session_offset PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_is_session PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_date_to_session PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_prev_next_open_close PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_sessions_in_range PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_sessions_has_break PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_sessions_window PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_sessions_distance PASSED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_trading_index FAILED [ 28%] tests/test_xcbf_calendar.py::TestXCBFCalendar::test_deprecated PASSED [ 28%] tests/test_xcse_calendar.py::TestXCSECalendar::test_testbase_integrity PASSED [ 28%] tests/test_xcse_calendar.py::TestXCSECalendar::test_base_integrity PASSED [ 28%] tests/test_xcse_calendar.py::TestXCSECalendar::test_calculated_against_csv PASSED [ 28%] tests/test_xcse_calendar.py::TestXCSECalendar::test_start_end PASSED [ 28%] tests/test_xcse_calendar.py::TestXCSECalendar::test_invalid_input PASSED [ 28%] tests/test_xcse_calendar.py::TestXCSECalendar::test_bound_min PASSED [ 28%] tests/test_xcse_calendar.py::TestXCSECalendar::test_bound_max PASSED [ 28%] tests/test_xcse_calendar.py::TestXCSECalendar::test_sanity_check_session_lengths PASSED [ 28%] tests/test_xcse_calendar.py::TestXCSECalendar::test_adhoc_holidays_specification PASSED [ 28%] tests/test_xcse_calendar.py::TestXCSECalendar::test_daylight_savings PASSED [ 28%] tests/test_xcse_calendar.py::TestXCSECalendar::test_sessions PASSED [ 28%] tests/test_xcse_calendar.py::TestXCSECalendar::test_opens_closes_break_starts_ends PASSED [ 28%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minutes_properties[both] PASSED [ 28%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minutes[both] PASSED [ 28%] tests/test_xcse_calendar.py::TestXCSECalendar::test_calendar_bounds_properties[both] PASSED [ 28%] tests/test_xcse_calendar.py::TestXCSECalendar::test_session_minute_methods[both] PASSED [ 28%] tests/test_xcse_calendar.py::TestXCSECalendar::test_session_minutes[both] PASSED [ 28%] tests/test_xcse_calendar.py::TestXCSECalendar::test_is_trading_minute[both] PASSED [ 28%] tests/test_xcse_calendar.py::TestXCSECalendar::test_is_break_minute[both] PASSED [ 28%] tests/test_xcse_calendar.py::TestXCSECalendar::test_is_open_on_minute[both] PASSED [ 28%] tests/test_xcse_calendar.py::TestXCSECalendar::test_is_open_at_time[both] PASSED [ 28%] tests/test_xcse_calendar.py::TestXCSECalendar::test_prev_next_minute[both] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_to_session[both-next] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_to_trading_minute[both-next] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_to_session[left-next] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_to_trading_minute[left-next] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minutes_properties[left] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minutes[left] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_calendar_bounds_properties[left] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_session_minute_methods[left] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_session_minutes[left] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_is_trading_minute[left] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_is_break_minute[left] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_is_open_on_minute[left] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_is_open_at_time[left] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_prev_next_minute[left] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_to_session[left-previous] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_to_trading_minute[left-previous] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_to_session[both-previous] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_to_trading_minute[both-previous] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_to_session[right-previous] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_to_trading_minute[right-previous] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_to_session[right-next] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_to_trading_minute[right-next] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minutes_properties[right] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minutes[right] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_calendar_bounds_properties[right] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_session_minute_methods[right] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_session_minutes[right] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_is_trading_minute[right] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_is_break_minute[right] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_is_open_on_minute[right] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_is_open_at_time[right] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_prev_next_minute[right] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_to_session[right-none] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_to_trading_minute[right-none] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_to_session[left-none] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_to_trading_minute[left-none] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_to_session[both-none] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_to_trading_minute[both-none] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_to_session[neither-none] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_to_trading_minute[neither-none] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_to_session[neither-previous] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_to_session[neither-next] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_to_trading_minute[neither-next] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minutes_properties[neither] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minutes[neither] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_calendar_bounds_properties[neither] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_session_minute_methods[neither] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_session_minutes[neither] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_is_trading_minute[neither] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_is_break_minute[neither] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_is_open_on_minute[neither] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_is_open_at_time[neither] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_prev_next_minute[neither] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_to_past_session[neither] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_to_future_session[neither] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_offset[neither] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_offset_by_sessions[neither] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minutes_in_range[neither] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minutes_window[neither] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minutes_distance[neither] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minutes_to_sessions[neither] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_sessions_minutes[neither] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_sessions_minutes_count[neither] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_to_past_session[right] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_to_future_session[right] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_offset[right] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_offset_by_sessions[right] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minutes_in_range[right] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minutes_window[right] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minutes_distance[right] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minutes_to_sessions[right] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_sessions_minutes[right] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_sessions_minutes_count[right] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_to_past_session[left] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_to_future_session[left] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_offset[left] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_offset_by_sessions[left] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minutes_in_range[left] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minutes_window[left] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minutes_distance[left] PASSED [ 29%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minutes_to_sessions[left] PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_sessions_minutes[left] PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_sessions_minutes_count[left] PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_to_past_session[both] PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_to_future_session[both] PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_offset[both] PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minute_offset_by_sessions[both] PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minutes_in_range[both] PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minutes_window[both] PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minutes_distance[both] PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_minutes_to_sessions[both] PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_sessions_minutes[both] PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_sessions_minutes_count[both] PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_has_break PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_regular_holidays_sample PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_adhoc_holidays_sample PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_non_holidays_sample PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_late_opens_sample PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_early_closes_sample PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_early_closes_sample_time PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_early_closes_weekdays PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_early_closes_weekdays_time PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_non_early_closes_sample PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_non_early_closes_sample_time PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_late_opens PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_early_closes PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_session_open_close_break_start_end PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_session_has_break PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_next_prev_session PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_session_offset PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_is_session PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_date_to_session PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_prev_next_open_close PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_sessions_in_range PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_sessions_has_break PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_sessions_window PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_sessions_distance PASSED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_trading_index FAILED [ 30%] tests/test_xcse_calendar.py::TestXCSECalendar::test_deprecated PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_testbase_integrity PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_base_integrity PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_calculated_against_csv PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_start_end PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_invalid_input PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_bound_min PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_bound_max PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_sanity_check_session_lengths PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_adhoc_holidays_specification PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_daylight_savings PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_sessions PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_opens_closes_break_starts_ends PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minutes_properties[both] PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minutes[both] PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_calendar_bounds_properties[both] PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_session_minute_methods[both] PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_session_minutes[both] PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_is_trading_minute[both] PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_is_break_minute[both] PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_is_open_on_minute[both] PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_is_open_at_time[both] PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_prev_next_minute[both] PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_to_session[both-next] PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_to_trading_minute[both-next] PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_to_session[left-next] PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_to_trading_minute[left-next] PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minutes_properties[left] PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minutes[left] PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_calendar_bounds_properties[left] PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_session_minute_methods[left] PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_session_minutes[left] PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_is_trading_minute[left] PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_is_break_minute[left] PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_is_open_on_minute[left] PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_is_open_at_time[left] PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_prev_next_minute[left] PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_to_session[left-previous] PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_to_session[both-previous] PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_to_session[right-previous] PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_to_session[right-next] PASSED [ 30%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_to_trading_minute[right-next] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minutes_properties[right] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minutes[right] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_calendar_bounds_properties[right] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_session_minute_methods[right] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_session_minutes[right] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_is_trading_minute[right] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_is_break_minute[right] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_is_open_on_minute[right] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_is_open_at_time[right] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_prev_next_minute[right] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_to_session[right-none] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_to_trading_minute[right-none] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_to_session[left-none] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_to_trading_minute[left-none] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_to_session[both-none] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_to_trading_minute[both-none] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_to_session[neither-none] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_to_session[neither-previous] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_to_session[neither-next] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minutes_properties[neither] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minutes[neither] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_calendar_bounds_properties[neither] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_session_minute_methods[neither] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_session_minutes[neither] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_is_trading_minute[neither] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_is_break_minute[neither] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_is_open_on_minute[neither] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_is_open_at_time[neither] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_prev_next_minute[neither] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_to_past_session[neither] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_to_future_session[neither] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_offset[neither] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_offset_by_sessions[neither] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minutes_in_range[neither] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minutes_window[neither] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minutes_distance[neither] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minutes_to_sessions[neither] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_sessions_minutes[neither] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_sessions_minutes_count[neither] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_to_past_session[right] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_to_future_session[right] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_offset[right] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_offset_by_sessions[right] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minutes_in_range[right] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minutes_window[right] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minutes_distance[right] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minutes_to_sessions[right] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_sessions_minutes[right] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_sessions_minutes_count[right] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_to_past_session[left] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_to_future_session[left] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_offset[left] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_offset_by_sessions[left] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minutes_in_range[left] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minutes_window[left] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minutes_distance[left] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minutes_to_sessions[left] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_sessions_minutes[left] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_sessions_minutes_count[left] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_to_past_session[both] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_to_future_session[both] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_offset[both] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minute_offset_by_sessions[both] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minutes_in_range[both] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minutes_window[both] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minutes_distance[both] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_minutes_to_sessions[both] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_sessions_minutes[both] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_sessions_minutes_count[both] PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_has_break PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_regular_holidays_sample PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_adhoc_holidays_sample PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_non_holidays_sample PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_late_opens_sample PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_early_closes_sample PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_early_closes_sample_time PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_early_closes_weekdays PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_early_closes_weekdays_time PASSED [ 31%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_non_early_closes_sample PASSED [ 32%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_non_early_closes_sample_time PASSED [ 32%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_late_opens PASSED [ 32%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_early_closes PASSED [ 32%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_session_open_close_break_start_end PASSED [ 32%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_session_has_break PASSED [ 32%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_next_prev_session PASSED [ 32%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_session_offset PASSED [ 32%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_is_session PASSED [ 32%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_date_to_session PASSED [ 32%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_prev_next_open_close PASSED [ 32%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_sessions_in_range PASSED [ 32%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_sessions_has_break PASSED [ 32%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_sessions_window PASSED [ 32%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_sessions_distance PASSED [ 32%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_trading_index FAILED [ 32%] tests/test_xdub_calendar.py::TestXDUBCalendar::test_deprecated PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_testbase_integrity PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_base_integrity PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_calculated_against_csv PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_start_end PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_invalid_input PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_bound_min PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_bound_max PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_sanity_check_session_lengths PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_adhoc_holidays_specification PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_daylight_savings PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_sessions PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_opens_closes_break_starts_ends PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minutes_properties[both] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minutes[both] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_calendar_bounds_properties[both] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_session_minute_methods[both] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_session_minutes[both] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_is_trading_minute[both] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_is_break_minute[both] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_is_open_on_minute[both] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_is_open_at_time[both] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_prev_next_minute[both] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_to_session[both-next] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_to_trading_minute[both-next] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_to_session[left-next] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_to_trading_minute[left-next] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minutes_properties[left] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minutes[left] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_calendar_bounds_properties[left] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_session_minute_methods[left] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_session_minutes[left] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_is_trading_minute[left] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_is_break_minute[left] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_is_open_on_minute[left] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_is_open_at_time[left] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_prev_next_minute[left] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_to_session[left-previous] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_to_session[both-previous] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_to_session[right-previous] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_to_session[right-next] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_to_trading_minute[right-next] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minutes_properties[right] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minutes[right] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_calendar_bounds_properties[right] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_session_minute_methods[right] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_session_minutes[right] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_is_trading_minute[right] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_is_break_minute[right] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_is_open_on_minute[right] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_is_open_at_time[right] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_prev_next_minute[right] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_to_session[right-none] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_to_trading_minute[right-none] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_to_session[left-none] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_to_trading_minute[left-none] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_to_session[both-none] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_to_trading_minute[both-none] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_to_session[neither-none] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_to_session[neither-previous] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_to_session[neither-next] PASSED [ 32%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minutes_properties[neither] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minutes[neither] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_calendar_bounds_properties[neither] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_session_minute_methods[neither] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_session_minutes[neither] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_is_trading_minute[neither] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_is_break_minute[neither] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_is_open_on_minute[neither] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_is_open_at_time[neither] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_prev_next_minute[neither] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_to_past_session[neither] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_to_future_session[neither] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_offset[neither] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_offset_by_sessions[neither] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minutes_in_range[neither] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minutes_window[neither] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minutes_distance[neither] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minutes_to_sessions[neither] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_sessions_minutes[neither] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_sessions_minutes_count[neither] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_to_past_session[right] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_to_future_session[right] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_offset[right] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_offset_by_sessions[right] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minutes_in_range[right] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minutes_window[right] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minutes_distance[right] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minutes_to_sessions[right] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_sessions_minutes[right] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_sessions_minutes_count[right] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_to_past_session[left] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_to_future_session[left] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_offset[left] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_offset_by_sessions[left] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minutes_in_range[left] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minutes_window[left] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minutes_distance[left] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minutes_to_sessions[left] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_sessions_minutes[left] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_sessions_minutes_count[left] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_to_past_session[both] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_to_future_session[both] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_offset[both] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minute_offset_by_sessions[both] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minutes_in_range[both] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minutes_window[both] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minutes_distance[both] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_minutes_to_sessions[both] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_sessions_minutes[both] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_sessions_minutes_count[both] PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_has_break PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_regular_holidays_sample PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_adhoc_holidays_sample PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_non_holidays_sample PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_late_opens_sample PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_early_closes_sample PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_early_closes_sample_time PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_early_closes_weekdays PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_early_closes_weekdays_time PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_non_early_closes_sample PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_non_early_closes_sample_time PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_late_opens PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_early_closes PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_session_open_close_break_start_end PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_session_has_break PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_next_prev_session PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_session_offset PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_is_session PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_date_to_session PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_prev_next_open_close PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_sessions_in_range PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_sessions_has_break PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_sessions_window PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_sessions_distance PASSED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_trading_index FAILED [ 33%] tests/test_xdus_calendar.py::TestXDUSCalendar::test_deprecated PASSED [ 33%] tests/test_xeee_calendar.py::TestXEEECalendar::test_testbase_integrity PASSED [ 33%] tests/test_xeee_calendar.py::TestXEEECalendar::test_base_integrity PASSED [ 33%] tests/test_xeee_calendar.py::TestXEEECalendar::test_calculated_against_csv PASSED [ 33%] tests/test_xeee_calendar.py::TestXEEECalendar::test_start_end PASSED [ 33%] tests/test_xeee_calendar.py::TestXEEECalendar::test_invalid_input PASSED [ 33%] tests/test_xeee_calendar.py::TestXEEECalendar::test_bound_min PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_bound_max PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_sanity_check_session_lengths PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_adhoc_holidays_specification PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_daylight_savings PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_sessions PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_opens_closes_break_starts_ends PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minutes_properties[both] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minutes[both] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_calendar_bounds_properties[both] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_session_minute_methods[both] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_session_minutes[both] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_is_trading_minute[both] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_is_break_minute[both] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_is_open_on_minute[both] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_is_open_at_time[both] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_prev_next_minute[both] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_to_session[both-next] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_to_trading_minute[both-next] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_to_session[left-next] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_to_trading_minute[left-next] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minutes_properties[left] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minutes[left] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_calendar_bounds_properties[left] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_session_minute_methods[left] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_session_minutes[left] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_is_trading_minute[left] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_is_break_minute[left] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_is_open_on_minute[left] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_is_open_at_time[left] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_prev_next_minute[left] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_to_session[left-previous] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_to_trading_minute[left-previous] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_to_session[both-previous] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_to_trading_minute[both-previous] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_to_session[right-previous] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_to_trading_minute[right-previous] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_to_session[right-next] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_to_trading_minute[right-next] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minutes_properties[right] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minutes[right] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_calendar_bounds_properties[right] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_session_minute_methods[right] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_session_minutes[right] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_is_trading_minute[right] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_is_break_minute[right] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_is_open_on_minute[right] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_is_open_at_time[right] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_prev_next_minute[right] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_to_session[right-none] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_to_trading_minute[right-none] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_to_session[left-none] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_to_trading_minute[left-none] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_to_session[both-none] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_to_trading_minute[both-none] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_to_session[neither-none] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_to_trading_minute[neither-none] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_to_session[neither-previous] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_to_session[neither-next] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_to_trading_minute[neither-next] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minutes_properties[neither] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minutes[neither] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_calendar_bounds_properties[neither] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_session_minute_methods[neither] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_session_minutes[neither] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_is_trading_minute[neither] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_is_break_minute[neither] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_is_open_on_minute[neither] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_is_open_at_time[neither] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_prev_next_minute[neither] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_to_past_session[neither] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_to_future_session[neither] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_offset[neither] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_offset_by_sessions[neither] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minutes_in_range[neither] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minutes_window[neither] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minutes_distance[neither] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minutes_to_sessions[neither] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_sessions_minutes[neither] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_sessions_minutes_count[neither] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_to_past_session[right] PASSED [ 34%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_to_future_session[right] PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_offset[right] PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_offset_by_sessions[right] PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minutes_in_range[right] PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minutes_window[right] PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minutes_distance[right] PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minutes_to_sessions[right] PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_sessions_minutes[right] PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_sessions_minutes_count[right] PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_to_past_session[left] PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_to_future_session[left] PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_offset[left] PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_offset_by_sessions[left] PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minutes_in_range[left] PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minutes_window[left] PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minutes_distance[left] PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minutes_to_sessions[left] PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_sessions_minutes[left] PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_sessions_minutes_count[left] PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_to_past_session[both] PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_to_future_session[both] PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_offset[both] PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minute_offset_by_sessions[both] PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minutes_in_range[both] PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minutes_window[both] PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minutes_distance[both] PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_minutes_to_sessions[both] PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_sessions_minutes[both] PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_sessions_minutes_count[both] PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_has_break PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_regular_holidays_sample PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_adhoc_holidays_sample PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_non_holidays_sample PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_late_opens_sample PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_early_closes_sample PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_early_closes_sample_time PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_early_closes_weekdays PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_early_closes_weekdays_time PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_non_early_closes_sample PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_non_early_closes_sample_time PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_late_opens PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_early_closes PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_session_open_close_break_start_end PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_session_has_break PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_next_prev_session PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_session_offset PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_is_session PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_date_to_session PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_prev_next_open_close PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_sessions_in_range PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_sessions_has_break PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_sessions_window PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_sessions_distance PASSED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_trading_index FAILED [ 35%] tests/test_xeee_calendar.py::TestXEEECalendar::test_deprecated PASSED [ 35%] tests/test_xetr_calendar.py::TestXETRCalendar::test_testbase_integrity PASSED [ 35%] tests/test_xetr_calendar.py::TestXETRCalendar::test_base_integrity PASSED [ 35%] tests/test_xetr_calendar.py::TestXETRCalendar::test_calculated_against_csv PASSED [ 35%] tests/test_xetr_calendar.py::TestXETRCalendar::test_start_end PASSED [ 35%] tests/test_xetr_calendar.py::TestXETRCalendar::test_invalid_input PASSED [ 35%] tests/test_xetr_calendar.py::TestXETRCalendar::test_bound_min PASSED [ 35%] tests/test_xetr_calendar.py::TestXETRCalendar::test_bound_max PASSED [ 35%] tests/test_xetr_calendar.py::TestXETRCalendar::test_sanity_check_session_lengths PASSED [ 35%] tests/test_xetr_calendar.py::TestXETRCalendar::test_adhoc_holidays_specification PASSED [ 35%] tests/test_xetr_calendar.py::TestXETRCalendar::test_daylight_savings PASSED [ 35%] tests/test_xetr_calendar.py::TestXETRCalendar::test_sessions PASSED [ 35%] tests/test_xetr_calendar.py::TestXETRCalendar::test_opens_closes_break_starts_ends PASSED [ 35%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minutes_properties[both] PASSED [ 35%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minutes[both] PASSED [ 35%] tests/test_xetr_calendar.py::TestXETRCalendar::test_calendar_bounds_properties[both] PASSED [ 35%] tests/test_xetr_calendar.py::TestXETRCalendar::test_session_minute_methods[both] PASSED [ 35%] tests/test_xetr_calendar.py::TestXETRCalendar::test_session_minutes[both] PASSED [ 35%] tests/test_xetr_calendar.py::TestXETRCalendar::test_is_trading_minute[both] PASSED [ 35%] tests/test_xetr_calendar.py::TestXETRCalendar::test_is_break_minute[both] PASSED [ 35%] tests/test_xetr_calendar.py::TestXETRCalendar::test_is_open_on_minute[both] PASSED [ 35%] tests/test_xetr_calendar.py::TestXETRCalendar::test_is_open_at_time[both] PASSED [ 35%] tests/test_xetr_calendar.py::TestXETRCalendar::test_prev_next_minute[both] PASSED [ 35%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_to_session[both-next] PASSED [ 35%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_to_trading_minute[both-next] PASSED [ 35%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_to_session[left-next] PASSED [ 35%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_to_trading_minute[left-next] PASSED [ 35%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minutes_properties[left] PASSED [ 35%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minutes[left] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_calendar_bounds_properties[left] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_session_minute_methods[left] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_session_minutes[left] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_is_trading_minute[left] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_is_break_minute[left] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_is_open_on_minute[left] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_is_open_at_time[left] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_prev_next_minute[left] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_to_session[left-previous] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_to_session[both-previous] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_to_session[right-previous] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_to_session[right-next] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_to_trading_minute[right-next] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minutes_properties[right] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minutes[right] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_calendar_bounds_properties[right] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_session_minute_methods[right] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_session_minutes[right] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_is_trading_minute[right] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_is_break_minute[right] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_is_open_on_minute[right] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_is_open_at_time[right] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_prev_next_minute[right] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_to_session[right-none] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_to_trading_minute[right-none] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_to_session[left-none] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_to_trading_minute[left-none] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_to_session[both-none] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_to_trading_minute[both-none] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_to_session[neither-none] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_to_session[neither-previous] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_to_session[neither-next] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minutes_properties[neither] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minutes[neither] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_calendar_bounds_properties[neither] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_session_minute_methods[neither] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_session_minutes[neither] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_is_trading_minute[neither] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_is_break_minute[neither] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_is_open_on_minute[neither] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_is_open_at_time[neither] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_prev_next_minute[neither] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_to_past_session[neither] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_to_future_session[neither] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_offset[neither] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_offset_by_sessions[neither] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minutes_in_range[neither] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minutes_window[neither] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minutes_distance[neither] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minutes_to_sessions[neither] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_sessions_minutes[neither] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_sessions_minutes_count[neither] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_to_past_session[right] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_to_future_session[right] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_offset[right] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_offset_by_sessions[right] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minutes_in_range[right] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minutes_window[right] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minutes_distance[right] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minutes_to_sessions[right] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_sessions_minutes[right] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_sessions_minutes_count[right] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_to_past_session[left] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_to_future_session[left] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_offset[left] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_offset_by_sessions[left] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minutes_in_range[left] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minutes_window[left] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minutes_distance[left] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minutes_to_sessions[left] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_sessions_minutes[left] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_sessions_minutes_count[left] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_to_past_session[both] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_to_future_session[both] PASSED [ 36%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_offset[both] PASSED [ 37%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minute_offset_by_sessions[both] PASSED [ 37%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minutes_in_range[both] PASSED [ 37%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minutes_window[both] PASSED [ 37%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minutes_distance[both] PASSED [ 37%] tests/test_xetr_calendar.py::TestXETRCalendar::test_minutes_to_sessions[both] PASSED [ 37%] tests/test_xetr_calendar.py::TestXETRCalendar::test_sessions_minutes[both] PASSED [ 37%] tests/test_xetr_calendar.py::TestXETRCalendar::test_sessions_minutes_count[both] PASSED [ 37%] tests/test_xetr_calendar.py::TestXETRCalendar::test_has_break PASSED [ 37%] tests/test_xetr_calendar.py::TestXETRCalendar::test_regular_holidays_sample PASSED [ 37%] tests/test_xetr_calendar.py::TestXETRCalendar::test_adhoc_holidays_sample PASSED [ 37%] tests/test_xetr_calendar.py::TestXETRCalendar::test_non_holidays_sample PASSED [ 37%] tests/test_xetr_calendar.py::TestXETRCalendar::test_late_opens_sample PASSED [ 37%] tests/test_xetr_calendar.py::TestXETRCalendar::test_early_closes_sample PASSED [ 37%] tests/test_xetr_calendar.py::TestXETRCalendar::test_early_closes_sample_time PASSED [ 37%] tests/test_xetr_calendar.py::TestXETRCalendar::test_early_closes_weekdays PASSED [ 37%] tests/test_xetr_calendar.py::TestXETRCalendar::test_early_closes_weekdays_time PASSED [ 37%] tests/test_xetr_calendar.py::TestXETRCalendar::test_non_early_closes_sample PASSED [ 37%] tests/test_xetr_calendar.py::TestXETRCalendar::test_non_early_closes_sample_time PASSED [ 37%] tests/test_xetr_calendar.py::TestXETRCalendar::test_late_opens PASSED [ 37%] tests/test_xetr_calendar.py::TestXETRCalendar::test_early_closes PASSED [ 37%] tests/test_xetr_calendar.py::TestXETRCalendar::test_session_open_close_break_start_end PASSED [ 37%] tests/test_xetr_calendar.py::TestXETRCalendar::test_session_has_break PASSED [ 37%] tests/test_xetr_calendar.py::TestXETRCalendar::test_next_prev_session PASSED [ 37%] tests/test_xetr_calendar.py::TestXETRCalendar::test_session_offset PASSED [ 37%] tests/test_xetr_calendar.py::TestXETRCalendar::test_is_session PASSED [ 37%] tests/test_xetr_calendar.py::TestXETRCalendar::test_date_to_session PASSED [ 37%] tests/test_xetr_calendar.py::TestXETRCalendar::test_prev_next_open_close PASSED [ 37%] tests/test_xetr_calendar.py::TestXETRCalendar::test_sessions_in_range PASSED [ 37%] tests/test_xetr_calendar.py::TestXETRCalendar::test_sessions_has_break PASSED [ 37%] tests/test_xetr_calendar.py::TestXETRCalendar::test_sessions_window PASSED [ 37%] tests/test_xetr_calendar.py::TestXETRCalendar::test_sessions_distance PASSED [ 37%] tests/test_xetr_calendar.py::TestXETRCalendar::test_trading_index FAILED [ 37%] tests/test_xetr_calendar.py::TestXETRCalendar::test_deprecated PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_testbase_integrity PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_base_integrity PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_calculated_against_csv PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_start_end PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_invalid_input PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_bound_min PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_bound_max PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_sanity_check_session_lengths PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_adhoc_holidays_specification PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_daylight_savings PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_sessions PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_opens_closes_break_starts_ends PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minutes_properties[both] PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minutes[both] PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_calendar_bounds_properties[both] PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_session_minute_methods[both] PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_session_minutes[both] PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_is_trading_minute[both] PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_is_break_minute[both] PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_is_open_on_minute[both] PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_is_open_at_time[both] PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_prev_next_minute[both] PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_to_session[both-next] PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_to_trading_minute[both-next] PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_to_session[left-next] PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_to_trading_minute[left-next] PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minutes_properties[left] PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minutes[left] PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_calendar_bounds_properties[left] PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_session_minute_methods[left] PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_session_minutes[left] PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_is_trading_minute[left] PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_is_break_minute[left] PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_is_open_on_minute[left] PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_is_open_at_time[left] PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_prev_next_minute[left] PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_to_session[left-previous] PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_to_trading_minute[left-previous] PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_to_session[both-previous] PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_to_trading_minute[both-previous] PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_to_session[right-previous] PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_to_trading_minute[right-previous] PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_to_session[right-next] PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_to_trading_minute[right-next] PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minutes_properties[right] PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minutes[right] PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_calendar_bounds_properties[right] PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_session_minute_methods[right] PASSED [ 37%] tests/test_xfra_calendar.py::TestXFRACalendar::test_session_minutes[right] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_is_trading_minute[right] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_is_break_minute[right] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_is_open_on_minute[right] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_is_open_at_time[right] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_prev_next_minute[right] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_to_session[right-none] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_to_trading_minute[right-none] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_to_session[left-none] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_to_trading_minute[left-none] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_to_session[both-none] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_to_trading_minute[both-none] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_to_session[neither-none] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_to_trading_minute[neither-none] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_to_session[neither-previous] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_to_session[neither-next] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_to_trading_minute[neither-next] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minutes_properties[neither] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minutes[neither] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_calendar_bounds_properties[neither] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_session_minute_methods[neither] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_session_minutes[neither] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_is_trading_minute[neither] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_is_break_minute[neither] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_is_open_on_minute[neither] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_is_open_at_time[neither] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_prev_next_minute[neither] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_to_past_session[neither] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_to_future_session[neither] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_offset[neither] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_offset_by_sessions[neither] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minutes_in_range[neither] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minutes_window[neither] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minutes_distance[neither] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minutes_to_sessions[neither] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_sessions_minutes[neither] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_sessions_minutes_count[neither] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_to_past_session[right] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_to_future_session[right] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_offset[right] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_offset_by_sessions[right] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minutes_in_range[right] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minutes_window[right] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minutes_distance[right] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minutes_to_sessions[right] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_sessions_minutes[right] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_sessions_minutes_count[right] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_to_past_session[left] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_to_future_session[left] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_offset[left] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_offset_by_sessions[left] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minutes_in_range[left] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minutes_window[left] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minutes_distance[left] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minutes_to_sessions[left] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_sessions_minutes[left] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_sessions_minutes_count[left] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_to_past_session[both] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_to_future_session[both] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_offset[both] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minute_offset_by_sessions[both] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minutes_in_range[both] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minutes_window[both] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minutes_distance[both] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_minutes_to_sessions[both] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_sessions_minutes[both] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_sessions_minutes_count[both] PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_has_break PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_regular_holidays_sample PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_adhoc_holidays_sample PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_non_holidays_sample PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_late_opens_sample PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_early_closes_sample PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_early_closes_sample_time PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_early_closes_weekdays PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_early_closes_weekdays_time PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_non_early_closes_sample PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_non_early_closes_sample_time PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_late_opens PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_early_closes PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_session_open_close_break_start_end PASSED [ 38%] tests/test_xfra_calendar.py::TestXFRACalendar::test_session_has_break PASSED [ 39%] tests/test_xfra_calendar.py::TestXFRACalendar::test_next_prev_session PASSED [ 39%] tests/test_xfra_calendar.py::TestXFRACalendar::test_session_offset PASSED [ 39%] tests/test_xfra_calendar.py::TestXFRACalendar::test_is_session PASSED [ 39%] tests/test_xfra_calendar.py::TestXFRACalendar::test_date_to_session PASSED [ 39%] tests/test_xfra_calendar.py::TestXFRACalendar::test_prev_next_open_close PASSED [ 39%] tests/test_xfra_calendar.py::TestXFRACalendar::test_sessions_in_range PASSED [ 39%] tests/test_xfra_calendar.py::TestXFRACalendar::test_sessions_has_break PASSED [ 39%] tests/test_xfra_calendar.py::TestXFRACalendar::test_sessions_window PASSED [ 39%] tests/test_xfra_calendar.py::TestXFRACalendar::test_sessions_distance PASSED [ 39%] tests/test_xfra_calendar.py::TestXFRACalendar::test_trading_index FAILED [ 39%] tests/test_xfra_calendar.py::TestXFRACalendar::test_deprecated PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_testbase_integrity PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_base_integrity PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_calculated_against_csv PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_start_end PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_invalid_input PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_bound_min PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_bound_max PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_sanity_check_session_lengths PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_adhoc_holidays_specification PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_daylight_savings PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_sessions PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_opens_closes_break_starts_ends PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minutes_properties[both] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minutes[both] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_calendar_bounds_properties[both] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_session_minute_methods[both] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_session_minutes[both] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_is_trading_minute[both] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_is_break_minute[both] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_is_open_on_minute[both] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_is_open_at_time[both] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_prev_next_minute[both] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_to_session[both-next] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_to_trading_minute[both-next] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_to_session[left-next] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_to_trading_minute[left-next] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minutes_properties[left] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minutes[left] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_calendar_bounds_properties[left] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_session_minute_methods[left] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_session_minutes[left] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_is_trading_minute[left] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_is_break_minute[left] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_is_open_on_minute[left] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_is_open_at_time[left] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_prev_next_minute[left] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_to_session[left-previous] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_to_session[both-previous] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_to_session[right-previous] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_to_session[right-next] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_to_trading_minute[right-next] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minutes_properties[right] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minutes[right] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_calendar_bounds_properties[right] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_session_minute_methods[right] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_session_minutes[right] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_is_trading_minute[right] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_is_break_minute[right] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_is_open_on_minute[right] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_is_open_at_time[right] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_prev_next_minute[right] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_to_session[right-none] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_to_trading_minute[right-none] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_to_session[left-none] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_to_trading_minute[left-none] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_to_session[both-none] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_to_trading_minute[both-none] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_to_session[neither-none] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_to_session[neither-previous] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_to_session[neither-next] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minutes_properties[neither] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minutes[neither] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_calendar_bounds_properties[neither] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_session_minute_methods[neither] PASSED [ 39%] tests/test_xham_calendar.py::TestXHAMCalendar::test_session_minutes[neither] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_is_trading_minute[neither] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_is_break_minute[neither] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_is_open_on_minute[neither] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_is_open_at_time[neither] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_prev_next_minute[neither] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_to_past_session[neither] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_to_future_session[neither] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_offset[neither] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_offset_by_sessions[neither] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minutes_in_range[neither] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minutes_window[neither] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minutes_distance[neither] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minutes_to_sessions[neither] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_sessions_minutes[neither] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_sessions_minutes_count[neither] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_to_past_session[right] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_to_future_session[right] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_offset[right] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_offset_by_sessions[right] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minutes_in_range[right] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minutes_window[right] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minutes_distance[right] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minutes_to_sessions[right] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_sessions_minutes[right] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_sessions_minutes_count[right] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_to_past_session[left] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_to_future_session[left] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_offset[left] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_offset_by_sessions[left] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minutes_in_range[left] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minutes_window[left] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minutes_distance[left] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minutes_to_sessions[left] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_sessions_minutes[left] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_sessions_minutes_count[left] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_to_past_session[both] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_to_future_session[both] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_offset[both] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minute_offset_by_sessions[both] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minutes_in_range[both] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minutes_window[both] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minutes_distance[both] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_minutes_to_sessions[both] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_sessions_minutes[both] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_sessions_minutes_count[both] PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_has_break PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_regular_holidays_sample PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_adhoc_holidays_sample PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_non_holidays_sample PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_late_opens_sample PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_early_closes_sample PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_early_closes_sample_time PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_early_closes_weekdays PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_early_closes_weekdays_time PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_non_early_closes_sample PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_non_early_closes_sample_time PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_late_opens PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_early_closes PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_session_open_close_break_start_end PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_session_has_break PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_next_prev_session PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_session_offset PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_is_session PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_date_to_session PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_prev_next_open_close PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_sessions_in_range PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_sessions_has_break PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_sessions_window PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_sessions_distance PASSED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_trading_index FAILED [ 40%] tests/test_xham_calendar.py::TestXHAMCalendar::test_deprecated PASSED [ 40%] tests/test_xhel_calendar.py::TestXHELCalendar::test_testbase_integrity PASSED [ 40%] tests/test_xhel_calendar.py::TestXHELCalendar::test_base_integrity PASSED [ 40%] tests/test_xhel_calendar.py::TestXHELCalendar::test_calculated_against_csv PASSED [ 40%] tests/test_xhel_calendar.py::TestXHELCalendar::test_start_end PASSED [ 40%] tests/test_xhel_calendar.py::TestXHELCalendar::test_invalid_input PASSED [ 40%] tests/test_xhel_calendar.py::TestXHELCalendar::test_bound_min PASSED [ 40%] tests/test_xhel_calendar.py::TestXHELCalendar::test_bound_max PASSED [ 40%] tests/test_xhel_calendar.py::TestXHELCalendar::test_sanity_check_session_lengths PASSED [ 40%] tests/test_xhel_calendar.py::TestXHELCalendar::test_adhoc_holidays_specification PASSED [ 40%] tests/test_xhel_calendar.py::TestXHELCalendar::test_daylight_savings PASSED [ 40%] tests/test_xhel_calendar.py::TestXHELCalendar::test_sessions PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_opens_closes_break_starts_ends PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minutes_properties[both] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minutes[both] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_calendar_bounds_properties[both] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_session_minute_methods[both] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_session_minutes[both] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_is_trading_minute[both] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_is_break_minute[both] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_is_open_on_minute[both] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_is_open_at_time[both] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_prev_next_minute[both] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_to_session[both-next] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_to_trading_minute[both-next] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_to_session[left-next] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_to_trading_minute[left-next] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minutes_properties[left] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minutes[left] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_calendar_bounds_properties[left] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_session_minute_methods[left] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_session_minutes[left] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_is_trading_minute[left] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_is_break_minute[left] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_is_open_on_minute[left] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_is_open_at_time[left] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_prev_next_minute[left] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_to_session[left-previous] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_to_session[both-previous] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_to_session[right-previous] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_to_session[right-next] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_to_trading_minute[right-next] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minutes_properties[right] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minutes[right] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_calendar_bounds_properties[right] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_session_minute_methods[right] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_session_minutes[right] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_is_trading_minute[right] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_is_break_minute[right] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_is_open_on_minute[right] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_is_open_at_time[right] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_prev_next_minute[right] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_to_session[right-none] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_to_trading_minute[right-none] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_to_session[left-none] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_to_trading_minute[left-none] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_to_session[both-none] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_to_trading_minute[both-none] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_to_session[neither-none] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_to_session[neither-previous] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_to_session[neither-next] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minutes_properties[neither] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minutes[neither] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_calendar_bounds_properties[neither] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_session_minute_methods[neither] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_session_minutes[neither] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_is_trading_minute[neither] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_is_break_minute[neither] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_is_open_on_minute[neither] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_is_open_at_time[neither] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_prev_next_minute[neither] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_to_past_session[neither] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_to_future_session[neither] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_offset[neither] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_offset_by_sessions[neither] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minutes_in_range[neither] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minutes_window[neither] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minutes_distance[neither] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minutes_to_sessions[neither] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_sessions_minutes[neither] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_sessions_minutes_count[neither] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_to_past_session[right] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_to_future_session[right] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_offset[right] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_offset_by_sessions[right] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minutes_in_range[right] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minutes_window[right] PASSED [ 41%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minutes_distance[right] PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minutes_to_sessions[right] PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_sessions_minutes[right] PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_sessions_minutes_count[right] PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_to_past_session[left] PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_to_future_session[left] PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_offset[left] PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_offset_by_sessions[left] PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minutes_in_range[left] PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minutes_window[left] PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minutes_distance[left] PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minutes_to_sessions[left] PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_sessions_minutes[left] PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_sessions_minutes_count[left] PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_to_past_session[both] PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_to_future_session[both] PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_offset[both] PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minute_offset_by_sessions[both] PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minutes_in_range[both] PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minutes_window[both] PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minutes_distance[both] PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_minutes_to_sessions[both] PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_sessions_minutes[both] PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_sessions_minutes_count[both] PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_has_break PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_regular_holidays_sample PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_adhoc_holidays_sample PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_non_holidays_sample PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_late_opens_sample PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_early_closes_sample PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_early_closes_sample_time PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_early_closes_weekdays PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_early_closes_weekdays_time PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_non_early_closes_sample PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_non_early_closes_sample_time PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_late_opens PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_early_closes PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_session_open_close_break_start_end PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_session_has_break PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_next_prev_session PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_session_offset PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_is_session PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_date_to_session PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_prev_next_open_close PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_sessions_in_range PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_sessions_has_break PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_sessions_window PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_sessions_distance PASSED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_trading_index FAILED [ 42%] tests/test_xhel_calendar.py::TestXHELCalendar::test_deprecated PASSED [ 42%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_testbase_integrity PASSED [ 42%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_base_integrity PASSED [ 42%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_calculated_against_csv PASSED [ 42%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_start_end PASSED [ 42%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_invalid_input PASSED [ 42%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_bound_min PASSED [ 42%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_bound_max PASSED [ 42%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_sanity_check_session_lengths PASSED [ 42%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_adhoc_holidays_specification PASSED [ 42%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_daylight_savings PASSED [ 42%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_sessions PASSED [ 42%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_opens_closes_break_starts_ends PASSED [ 42%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minutes_properties[both] PASSED [ 42%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minutes[both] PASSED [ 42%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_calendar_bounds_properties[both] PASSED [ 42%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_session_minute_methods[both] PASSED [ 42%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_session_minutes[both] PASSED [ 42%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_is_trading_minute[both] PASSED [ 42%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_is_break_minute[both] PASSED [ 42%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_is_open_on_minute[both] PASSED [ 42%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_is_open_at_time[both] PASSED [ 42%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_prev_next_minute[both] PASSED [ 42%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_to_session[both-next] PASSED [ 42%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_to_trading_minute[both-next] PASSED [ 42%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_to_session[left-next] PASSED [ 42%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_to_trading_minute[left-next] PASSED [ 42%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minutes_properties[left] PASSED [ 42%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minutes[left] PASSED [ 42%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_calendar_bounds_properties[left] PASSED [ 42%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_session_minute_methods[left] PASSED [ 42%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_session_minutes[left] PASSED [ 42%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_is_trading_minute[left] PASSED [ 42%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_is_break_minute[left] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_is_open_on_minute[left] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_is_open_at_time[left] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_prev_next_minute[left] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_to_session[left-previous] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_to_session[both-previous] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_to_session[right-previous] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_to_session[right-next] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_to_trading_minute[right-next] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minutes_properties[right] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minutes[right] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_calendar_bounds_properties[right] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_session_minute_methods[right] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_session_minutes[right] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_is_trading_minute[right] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_is_break_minute[right] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_is_open_on_minute[right] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_is_open_at_time[right] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_prev_next_minute[right] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_to_session[right-none] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_to_trading_minute[right-none] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_to_session[left-none] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_to_trading_minute[left-none] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_to_session[both-none] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_to_trading_minute[both-none] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_to_session[neither-none] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_to_session[neither-previous] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_to_session[neither-next] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minutes_properties[neither] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minutes[neither] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_calendar_bounds_properties[neither] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_session_minute_methods[neither] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_session_minutes[neither] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_is_trading_minute[neither] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_is_break_minute[neither] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_is_open_on_minute[neither] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_is_open_at_time[neither] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_prev_next_minute[neither] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_to_past_session[neither] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_to_future_session[neither] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_offset[neither] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_offset_by_sessions[neither] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minutes_in_range[neither] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minutes_window[neither] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minutes_distance[neither] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minutes_to_sessions[neither] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_sessions_minutes[neither] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_sessions_minutes_count[neither] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_to_past_session[right] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_to_future_session[right] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_offset[right] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_offset_by_sessions[right] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minutes_in_range[right] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minutes_window[right] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minutes_distance[right] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minutes_to_sessions[right] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_sessions_minutes[right] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_sessions_minutes_count[right] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_to_past_session[left] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_to_future_session[left] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_offset[left] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_offset_by_sessions[left] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minutes_in_range[left] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minutes_window[left] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minutes_distance[left] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minutes_to_sessions[left] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_sessions_minutes[left] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_sessions_minutes_count[left] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_to_past_session[both] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_to_future_session[both] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_offset[both] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minute_offset_by_sessions[both] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minutes_in_range[both] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minutes_window[both] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minutes_distance[both] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_minutes_to_sessions[both] PASSED [ 43%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_sessions_minutes[both] PASSED [ 44%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_sessions_minutes_count[both] PASSED [ 44%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_has_break PASSED [ 44%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_regular_holidays_sample PASSED [ 44%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_adhoc_holidays_sample PASSED [ 44%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_non_holidays_sample PASSED [ 44%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_late_opens_sample PASSED [ 44%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_early_closes_sample PASSED [ 44%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_early_closes_sample_time PASSED [ 44%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_early_closes_weekdays PASSED [ 44%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_early_closes_weekdays_time PASSED [ 44%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_non_early_closes_sample PASSED [ 44%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_non_early_closes_sample_time PASSED [ 44%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_late_opens PASSED [ 44%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_early_closes PASSED [ 44%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_session_open_close_break_start_end PASSED [ 44%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_session_has_break PASSED [ 44%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_next_prev_session PASSED [ 44%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_session_offset PASSED [ 44%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_is_session PASSED [ 44%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_date_to_session PASSED [ 44%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_prev_next_open_close PASSED [ 44%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_sessions_in_range PASSED [ 44%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_sessions_has_break PASSED [ 44%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_sessions_window PASSED [ 44%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_sessions_distance PASSED [ 44%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_trading_index FAILED [ 44%] tests/test_xhkg_calendar.py::TestXHKGCalendar::test_deprecated PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_testbase_integrity PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_base_integrity PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_calculated_against_csv PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_start_end PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_invalid_input PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_bound_min PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_bound_max PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_sanity_check_session_lengths PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_adhoc_holidays_specification PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_daylight_savings PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_sessions PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_opens_closes_break_starts_ends PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_minutes_properties[both] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_minutes[both] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_calendar_bounds_properties[both] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_session_minute_methods[both] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_session_minutes[both] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_is_trading_minute[both] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_is_break_minute[both] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_is_open_on_minute[both] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_is_open_at_time[both] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_prev_next_minute[both] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_to_session[both-next] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_to_trading_minute[both-next] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_to_session[left-next] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_to_trading_minute[left-next] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_minutes_properties[left] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_minutes[left] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_calendar_bounds_properties[left] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_session_minute_methods[left] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_session_minutes[left] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_is_trading_minute[left] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_is_break_minute[left] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_is_open_on_minute[left] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_is_open_at_time[left] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_prev_next_minute[left] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_to_session[left-previous] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_to_trading_minute[left-previous] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_to_session[both-previous] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_to_trading_minute[both-previous] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_to_session[right-previous] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_to_trading_minute[right-previous] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_to_session[right-next] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_to_trading_minute[right-next] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_minutes_properties[right] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_minutes[right] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_calendar_bounds_properties[right] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_session_minute_methods[right] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_session_minutes[right] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_is_trading_minute[right] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_is_break_minute[right] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_is_open_on_minute[right] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_is_open_at_time[right] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_prev_next_minute[right] PASSED [ 44%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_to_session[right-none] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_to_trading_minute[right-none] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_to_session[left-none] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_to_trading_minute[left-none] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_to_session[both-none] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_to_trading_minute[both-none] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_to_session[neither-none] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_to_trading_minute[neither-none] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_to_session[neither-previous] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_to_session[neither-next] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_to_trading_minute[neither-next] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minutes_properties[neither] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minutes[neither] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_calendar_bounds_properties[neither] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_session_minute_methods[neither] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_session_minutes[neither] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_is_trading_minute[neither] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_is_break_minute[neither] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_is_open_on_minute[neither] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_is_open_at_time[neither] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_prev_next_minute[neither] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_to_past_session[neither] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_to_future_session[neither] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_offset[neither] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_offset_by_sessions[neither] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minutes_in_range[neither] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minutes_window[neither] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minutes_distance[neither] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minutes_to_sessions[neither] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_sessions_minutes[neither] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_sessions_minutes_count[neither] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_to_past_session[right] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_to_future_session[right] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_offset[right] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_offset_by_sessions[right] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minutes_in_range[right] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minutes_window[right] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minutes_distance[right] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minutes_to_sessions[right] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_sessions_minutes[right] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_sessions_minutes_count[right] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_to_past_session[left] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_to_future_session[left] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_offset[left] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_offset_by_sessions[left] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minutes_in_range[left] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minutes_window[left] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minutes_distance[left] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minutes_to_sessions[left] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_sessions_minutes[left] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_sessions_minutes_count[left] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_to_past_session[both] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_to_future_session[both] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_offset[both] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minute_offset_by_sessions[both] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minutes_in_range[both] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minutes_window[both] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minutes_distance[both] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_minutes_to_sessions[both] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_sessions_minutes[both] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_sessions_minutes_count[both] PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_has_break PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_regular_holidays_sample PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_adhoc_holidays_sample PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_non_holidays_sample PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_late_opens_sample PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_early_closes_sample PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_early_closes_sample_time PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_early_closes_weekdays PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_early_closes_weekdays_time PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_non_early_closes_sample PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_non_early_closes_sample_time PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_late_opens PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_early_closes PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_session_open_close_break_start_end PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_session_has_break PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_next_prev_session PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_session_offset PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_is_session PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_date_to_session PASSED [ 45%] tests/test_xice_calendar.py::TestXICECalendar::test_prev_next_open_close PASSED [ 46%] tests/test_xice_calendar.py::TestXICECalendar::test_sessions_in_range PASSED [ 46%] tests/test_xice_calendar.py::TestXICECalendar::test_sessions_has_break PASSED [ 46%] tests/test_xice_calendar.py::TestXICECalendar::test_sessions_window PASSED [ 46%] tests/test_xice_calendar.py::TestXICECalendar::test_sessions_distance PASSED [ 46%] tests/test_xice_calendar.py::TestXICECalendar::test_trading_index FAILED [ 46%] tests/test_xice_calendar.py::TestXICECalendar::test_deprecated PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_testbase_integrity PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_base_integrity PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_calculated_against_csv PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_start_end PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_invalid_input PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_bound_min PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_bound_max PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_sanity_check_session_lengths PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_adhoc_holidays_specification PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_daylight_savings PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_sessions PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_opens_closes_break_starts_ends PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minutes_properties[both] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minutes[both] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_calendar_bounds_properties[both] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_session_minute_methods[both] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_session_minutes[both] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_is_trading_minute[both] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_is_break_minute[both] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_is_open_on_minute[both] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_is_open_at_time[both] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_prev_next_minute[both] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_to_session[both-next] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_to_trading_minute[both-next] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_to_session[left-next] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_to_trading_minute[left-next] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minutes_properties[left] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minutes[left] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_calendar_bounds_properties[left] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_session_minute_methods[left] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_session_minutes[left] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_is_trading_minute[left] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_is_break_minute[left] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_is_open_on_minute[left] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_is_open_at_time[left] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_prev_next_minute[left] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_to_session[left-previous] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_to_session[both-previous] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_to_session[right-previous] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_to_session[right-next] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_to_trading_minute[right-next] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minutes_properties[right] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minutes[right] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_calendar_bounds_properties[right] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_session_minute_methods[right] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_session_minutes[right] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_is_trading_minute[right] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_is_break_minute[right] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_is_open_on_minute[right] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_is_open_at_time[right] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_prev_next_minute[right] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_to_session[right-none] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_to_trading_minute[right-none] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_to_session[left-none] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_to_trading_minute[left-none] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_to_session[both-none] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_to_trading_minute[both-none] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_to_session[neither-none] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_to_session[neither-previous] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_to_session[neither-next] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minutes_properties[neither] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minutes[neither] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_calendar_bounds_properties[neither] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_session_minute_methods[neither] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_session_minutes[neither] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_is_trading_minute[neither] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_is_break_minute[neither] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_is_open_on_minute[neither] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_is_open_at_time[neither] PASSED [ 46%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_prev_next_minute[neither] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_to_past_session[neither] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_to_future_session[neither] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_offset[neither] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_offset_by_sessions[neither] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minutes_in_range[neither] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minutes_window[neither] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minutes_distance[neither] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minutes_to_sessions[neither] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_sessions_minutes[neither] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_sessions_minutes_count[neither] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_to_past_session[right] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_to_future_session[right] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_offset[right] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_offset_by_sessions[right] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minutes_in_range[right] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minutes_window[right] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minutes_distance[right] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minutes_to_sessions[right] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_sessions_minutes[right] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_sessions_minutes_count[right] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_to_past_session[left] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_to_future_session[left] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_offset[left] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_offset_by_sessions[left] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minutes_in_range[left] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minutes_window[left] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minutes_distance[left] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minutes_to_sessions[left] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_sessions_minutes[left] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_sessions_minutes_count[left] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_to_past_session[both] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_to_future_session[both] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_offset[both] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minute_offset_by_sessions[both] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minutes_in_range[both] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minutes_window[both] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minutes_distance[both] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_minutes_to_sessions[both] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_sessions_minutes[both] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_sessions_minutes_count[both] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_has_break PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_regular_holidays_sample PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_adhoc_holidays_sample PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_non_holidays_sample PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_late_opens_sample PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_early_closes_sample PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_early_closes_sample_time PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_early_closes_weekdays PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_early_closes_weekdays_time PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_non_early_closes_sample PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_non_early_closes_sample_time PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_late_opens PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_early_closes PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_session_open_close_break_start_end PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_session_has_break PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_next_prev_session PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_session_offset PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_is_session PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_date_to_session PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_prev_next_open_close PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_sessions_in_range PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_sessions_has_break PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_sessions_window PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_sessions_distance PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_trading_index FAILED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_deprecated PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_trading_days PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_holidays_in_year[2019-holidays0] PASSED [ 47%] tests/test_xidx_calendar.py::TestXIDXCalendar::test_holidays_in_year[2018-holidays1] PASSED [ 47%] tests/test_xist_calendar.py::TestXISTCalendar::test_testbase_integrity PASSED [ 47%] tests/test_xist_calendar.py::TestXISTCalendar::test_base_integrity PASSED [ 47%] tests/test_xist_calendar.py::TestXISTCalendar::test_calculated_against_csv PASSED [ 47%] tests/test_xist_calendar.py::TestXISTCalendar::test_start_end PASSED [ 47%] tests/test_xist_calendar.py::TestXISTCalendar::test_invalid_input PASSED [ 47%] tests/test_xist_calendar.py::TestXISTCalendar::test_bound_min PASSED [ 47%] tests/test_xist_calendar.py::TestXISTCalendar::test_bound_max PASSED [ 47%] tests/test_xist_calendar.py::TestXISTCalendar::test_sanity_check_session_lengths PASSED [ 47%] tests/test_xist_calendar.py::TestXISTCalendar::test_adhoc_holidays_specification PASSED [ 47%] tests/test_xist_calendar.py::TestXISTCalendar::test_daylight_savings PASSED [ 47%] tests/test_xist_calendar.py::TestXISTCalendar::test_sessions PASSED [ 47%] tests/test_xist_calendar.py::TestXISTCalendar::test_opens_closes_break_starts_ends PASSED [ 47%] tests/test_xist_calendar.py::TestXISTCalendar::test_minutes_properties[both] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minutes[both] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_calendar_bounds_properties[both] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_session_minute_methods[both] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_session_minutes[both] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_is_trading_minute[both] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_is_break_minute[both] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_is_open_on_minute[both] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_is_open_at_time[both] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_prev_next_minute[both] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_to_session[both-next] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_to_trading_minute[both-next] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_to_session[left-next] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_to_trading_minute[left-next] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minutes_properties[left] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minutes[left] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_calendar_bounds_properties[left] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_session_minute_methods[left] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_session_minutes[left] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_is_trading_minute[left] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_is_break_minute[left] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_is_open_on_minute[left] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_is_open_at_time[left] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_prev_next_minute[left] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_to_session[left-previous] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_to_session[both-previous] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_to_session[right-previous] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_to_session[right-next] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_to_trading_minute[right-next] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minutes_properties[right] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minutes[right] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_calendar_bounds_properties[right] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_session_minute_methods[right] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_session_minutes[right] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_is_trading_minute[right] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_is_break_minute[right] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_is_open_on_minute[right] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_is_open_at_time[right] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_prev_next_minute[right] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_to_session[right-none] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_to_trading_minute[right-none] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_to_session[left-none] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_to_trading_minute[left-none] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_to_session[both-none] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_to_trading_minute[both-none] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_to_session[neither-none] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_to_session[neither-previous] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_to_session[neither-next] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minutes_properties[neither] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minutes[neither] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_calendar_bounds_properties[neither] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_session_minute_methods[neither] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_session_minutes[neither] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_is_trading_minute[neither] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_is_break_minute[neither] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_is_open_on_minute[neither] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_is_open_at_time[neither] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_prev_next_minute[neither] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_to_past_session[neither] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_to_future_session[neither] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_offset[neither] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_offset_by_sessions[neither] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minutes_in_range[neither] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minutes_window[neither] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minutes_distance[neither] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minutes_to_sessions[neither] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_sessions_minutes[neither] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_sessions_minutes_count[neither] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_to_past_session[right] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_to_future_session[right] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_offset[right] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_offset_by_sessions[right] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minutes_in_range[right] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minutes_window[right] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minutes_distance[right] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_minutes_to_sessions[right] PASSED [ 48%] tests/test_xist_calendar.py::TestXISTCalendar::test_sessions_minutes[right] PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_sessions_minutes_count[right] PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_to_past_session[left] PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_to_future_session[left] PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_offset[left] PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_offset_by_sessions[left] PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_minutes_in_range[left] PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_minutes_window[left] PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_minutes_distance[left] PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_minutes_to_sessions[left] PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_sessions_minutes[left] PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_sessions_minutes_count[left] PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_to_past_session[both] PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_to_future_session[both] PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_offset[both] PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_minute_offset_by_sessions[both] PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_minutes_in_range[both] PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_minutes_window[both] PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_minutes_distance[both] PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_minutes_to_sessions[both] PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_sessions_minutes[both] PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_sessions_minutes_count[both] PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_has_break PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_regular_holidays_sample PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_adhoc_holidays_sample PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_non_holidays_sample PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_late_opens_sample PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_early_closes_sample PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_early_closes_sample_time PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_early_closes_weekdays PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_early_closes_weekdays_time PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_non_early_closes_sample PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_non_early_closes_sample_time PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_late_opens PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_early_closes PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_session_open_close_break_start_end PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_session_has_break PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_next_prev_session PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_session_offset PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_is_session PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_date_to_session PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_prev_next_open_close PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_sessions_in_range PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_sessions_has_break PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_sessions_window PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_sessions_distance PASSED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_trading_index FAILED [ 49%] tests/test_xist_calendar.py::TestXISTCalendar::test_deprecated PASSED [ 49%] tests/test_xjse_calendar.py::TestXJSECalendar::test_testbase_integrity PASSED [ 49%] tests/test_xjse_calendar.py::TestXJSECalendar::test_base_integrity PASSED [ 49%] tests/test_xjse_calendar.py::TestXJSECalendar::test_calculated_against_csv PASSED [ 49%] tests/test_xjse_calendar.py::TestXJSECalendar::test_start_end PASSED [ 49%] tests/test_xjse_calendar.py::TestXJSECalendar::test_invalid_input PASSED [ 49%] tests/test_xjse_calendar.py::TestXJSECalendar::test_bound_min PASSED [ 49%] tests/test_xjse_calendar.py::TestXJSECalendar::test_bound_max PASSED [ 49%] tests/test_xjse_calendar.py::TestXJSECalendar::test_sanity_check_session_lengths PASSED [ 49%] tests/test_xjse_calendar.py::TestXJSECalendar::test_adhoc_holidays_specification PASSED [ 49%] tests/test_xjse_calendar.py::TestXJSECalendar::test_daylight_savings PASSED [ 49%] tests/test_xjse_calendar.py::TestXJSECalendar::test_sessions PASSED [ 49%] tests/test_xjse_calendar.py::TestXJSECalendar::test_opens_closes_break_starts_ends PASSED [ 49%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minutes_properties[both] PASSED [ 49%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minutes[both] PASSED [ 49%] tests/test_xjse_calendar.py::TestXJSECalendar::test_calendar_bounds_properties[both] PASSED [ 49%] tests/test_xjse_calendar.py::TestXJSECalendar::test_session_minute_methods[both] PASSED [ 49%] tests/test_xjse_calendar.py::TestXJSECalendar::test_session_minutes[both] PASSED [ 49%] tests/test_xjse_calendar.py::TestXJSECalendar::test_is_trading_minute[both] PASSED [ 49%] tests/test_xjse_calendar.py::TestXJSECalendar::test_is_break_minute[both] PASSED [ 49%] tests/test_xjse_calendar.py::TestXJSECalendar::test_is_open_on_minute[both] PASSED [ 49%] tests/test_xjse_calendar.py::TestXJSECalendar::test_is_open_at_time[both] PASSED [ 49%] tests/test_xjse_calendar.py::TestXJSECalendar::test_prev_next_minute[both] PASSED [ 49%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_to_session[both-next] PASSED [ 49%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_to_trading_minute[both-next] PASSED [ 49%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_to_session[left-next] PASSED [ 49%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_to_trading_minute[left-next] PASSED [ 49%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minutes_properties[left] PASSED [ 49%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minutes[left] PASSED [ 49%] tests/test_xjse_calendar.py::TestXJSECalendar::test_calendar_bounds_properties[left] PASSED [ 49%] tests/test_xjse_calendar.py::TestXJSECalendar::test_session_minute_methods[left] PASSED [ 49%] tests/test_xjse_calendar.py::TestXJSECalendar::test_session_minutes[left] PASSED [ 49%] tests/test_xjse_calendar.py::TestXJSECalendar::test_is_trading_minute[left] PASSED [ 49%] tests/test_xjse_calendar.py::TestXJSECalendar::test_is_break_minute[left] PASSED [ 49%] tests/test_xjse_calendar.py::TestXJSECalendar::test_is_open_on_minute[left] PASSED [ 49%] tests/test_xjse_calendar.py::TestXJSECalendar::test_is_open_at_time[left] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_prev_next_minute[left] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_to_session[left-previous] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_to_trading_minute[left-previous] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_to_session[both-previous] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_to_trading_minute[both-previous] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_to_session[right-previous] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_to_trading_minute[right-previous] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_to_session[right-next] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_to_trading_minute[right-next] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minutes_properties[right] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minutes[right] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_calendar_bounds_properties[right] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_session_minute_methods[right] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_session_minutes[right] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_is_trading_minute[right] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_is_break_minute[right] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_is_open_on_minute[right] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_is_open_at_time[right] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_prev_next_minute[right] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_to_session[right-none] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_to_trading_minute[right-none] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_to_session[left-none] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_to_trading_minute[left-none] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_to_session[both-none] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_to_trading_minute[both-none] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_to_session[neither-none] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_to_trading_minute[neither-none] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_to_session[neither-previous] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_to_session[neither-next] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_to_trading_minute[neither-next] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minutes_properties[neither] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minutes[neither] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_calendar_bounds_properties[neither] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_session_minute_methods[neither] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_session_minutes[neither] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_is_trading_minute[neither] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_is_break_minute[neither] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_is_open_on_minute[neither] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_is_open_at_time[neither] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_prev_next_minute[neither] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_to_past_session[neither] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_to_future_session[neither] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_offset[neither] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_offset_by_sessions[neither] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minutes_in_range[neither] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minutes_window[neither] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minutes_distance[neither] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minutes_to_sessions[neither] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_sessions_minutes[neither] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_sessions_minutes_count[neither] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_to_past_session[right] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_to_future_session[right] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_offset[right] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_offset_by_sessions[right] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minutes_in_range[right] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minutes_window[right] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minutes_distance[right] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minutes_to_sessions[right] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_sessions_minutes[right] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_sessions_minutes_count[right] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_to_past_session[left] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_to_future_session[left] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_offset[left] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_offset_by_sessions[left] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minutes_in_range[left] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minutes_window[left] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minutes_distance[left] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minutes_to_sessions[left] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_sessions_minutes[left] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_sessions_minutes_count[left] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_to_past_session[both] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_to_future_session[both] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_offset[both] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minute_offset_by_sessions[both] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minutes_in_range[both] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minutes_window[both] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minutes_distance[both] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_minutes_to_sessions[both] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_sessions_minutes[both] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_sessions_minutes_count[both] PASSED [ 50%] tests/test_xjse_calendar.py::TestXJSECalendar::test_has_break PASSED [ 51%] tests/test_xjse_calendar.py::TestXJSECalendar::test_regular_holidays_sample PASSED [ 51%] tests/test_xjse_calendar.py::TestXJSECalendar::test_adhoc_holidays_sample PASSED [ 51%] tests/test_xjse_calendar.py::TestXJSECalendar::test_non_holidays_sample PASSED [ 51%] tests/test_xjse_calendar.py::TestXJSECalendar::test_late_opens_sample PASSED [ 51%] tests/test_xjse_calendar.py::TestXJSECalendar::test_early_closes_sample PASSED [ 51%] tests/test_xjse_calendar.py::TestXJSECalendar::test_early_closes_sample_time PASSED [ 51%] tests/test_xjse_calendar.py::TestXJSECalendar::test_early_closes_weekdays PASSED [ 51%] tests/test_xjse_calendar.py::TestXJSECalendar::test_early_closes_weekdays_time PASSED [ 51%] tests/test_xjse_calendar.py::TestXJSECalendar::test_non_early_closes_sample PASSED [ 51%] tests/test_xjse_calendar.py::TestXJSECalendar::test_non_early_closes_sample_time PASSED [ 51%] tests/test_xjse_calendar.py::TestXJSECalendar::test_late_opens PASSED [ 51%] tests/test_xjse_calendar.py::TestXJSECalendar::test_early_closes PASSED [ 51%] tests/test_xjse_calendar.py::TestXJSECalendar::test_session_open_close_break_start_end PASSED [ 51%] tests/test_xjse_calendar.py::TestXJSECalendar::test_session_has_break PASSED [ 51%] tests/test_xjse_calendar.py::TestXJSECalendar::test_next_prev_session PASSED [ 51%] tests/test_xjse_calendar.py::TestXJSECalendar::test_session_offset PASSED [ 51%] tests/test_xjse_calendar.py::TestXJSECalendar::test_is_session PASSED [ 51%] tests/test_xjse_calendar.py::TestXJSECalendar::test_date_to_session PASSED [ 51%] tests/test_xjse_calendar.py::TestXJSECalendar::test_prev_next_open_close PASSED [ 51%] tests/test_xjse_calendar.py::TestXJSECalendar::test_sessions_in_range PASSED [ 51%] tests/test_xjse_calendar.py::TestXJSECalendar::test_sessions_has_break PASSED [ 51%] tests/test_xjse_calendar.py::TestXJSECalendar::test_sessions_window PASSED [ 51%] tests/test_xjse_calendar.py::TestXJSECalendar::test_sessions_distance PASSED [ 51%] tests/test_xjse_calendar.py::TestXJSECalendar::test_trading_index FAILED [ 51%] tests/test_xjse_calendar.py::TestXJSECalendar::test_deprecated PASSED [ 51%] tests/test_xjse_calendar.py::TestXJSECalendar::test_no_weekend_sessions PASSED [ 51%] tests/test_xjse_calendar.py::TestXJSECalendar::test_holidays_in_year[2019-holidays0] PASSED [ 51%] tests/test_xjse_calendar.py::TestXJSECalendar::test_holidays_in_year[2018-holidays1] PASSED [ 51%] tests/test_xjse_calendar.py::TestXJSECalendar::test_holidays_in_year[2016-holidays2] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_testbase_integrity PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_base_integrity PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_calculated_against_csv PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_start_end PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_invalid_input PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_bound_min PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_bound_max PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_sanity_check_session_lengths PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_adhoc_holidays_specification PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_daylight_savings PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_sessions PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_opens_closes_break_starts_ends PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minutes_properties[both] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minutes[both] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_calendar_bounds_properties[both] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_session_minute_methods[both] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_session_minutes[both] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_is_trading_minute[both] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_is_break_minute[both] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_is_open_on_minute[both] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_is_open_at_time[both] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_prev_next_minute[both] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_to_session[both-next] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_to_trading_minute[both-next] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_to_session[left-next] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_to_trading_minute[left-next] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minutes_properties[left] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minutes[left] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_calendar_bounds_properties[left] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_session_minute_methods[left] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_session_minutes[left] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_is_trading_minute[left] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_is_break_minute[left] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_is_open_on_minute[left] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_is_open_at_time[left] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_prev_next_minute[left] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_to_session[left-previous] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_to_session[both-previous] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_to_session[right-previous] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_to_session[right-next] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_to_trading_minute[right-next] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minutes_properties[right] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minutes[right] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_calendar_bounds_properties[right] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_session_minute_methods[right] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_session_minutes[right] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_is_trading_minute[right] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_is_break_minute[right] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_is_open_on_minute[right] PASSED [ 51%] tests/test_xkar_calendar.py::TestXKARCalendar::test_is_open_at_time[right] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_prev_next_minute[right] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_to_session[right-none] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_to_trading_minute[right-none] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_to_session[left-none] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_to_trading_minute[left-none] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_to_session[both-none] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_to_trading_minute[both-none] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_to_session[neither-none] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_to_session[neither-previous] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_to_session[neither-next] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minutes_properties[neither] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minutes[neither] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_calendar_bounds_properties[neither] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_session_minute_methods[neither] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_session_minutes[neither] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_is_trading_minute[neither] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_is_break_minute[neither] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_is_open_on_minute[neither] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_is_open_at_time[neither] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_prev_next_minute[neither] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_to_past_session[neither] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_to_future_session[neither] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_offset[neither] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_offset_by_sessions[neither] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minutes_in_range[neither] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minutes_window[neither] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minutes_distance[neither] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minutes_to_sessions[neither] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_sessions_minutes[neither] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_sessions_minutes_count[neither] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_to_past_session[right] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_to_future_session[right] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_offset[right] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_offset_by_sessions[right] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minutes_in_range[right] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minutes_window[right] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minutes_distance[right] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minutes_to_sessions[right] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_sessions_minutes[right] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_sessions_minutes_count[right] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_to_past_session[left] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_to_future_session[left] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_offset[left] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_offset_by_sessions[left] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minutes_in_range[left] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minutes_window[left] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minutes_distance[left] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minutes_to_sessions[left] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_sessions_minutes[left] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_sessions_minutes_count[left] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_to_past_session[both] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_to_future_session[both] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_offset[both] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minute_offset_by_sessions[both] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minutes_in_range[both] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minutes_window[both] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minutes_distance[both] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_minutes_to_sessions[both] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_sessions_minutes[both] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_sessions_minutes_count[both] PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_has_break PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_regular_holidays_sample PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_adhoc_holidays_sample PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_non_holidays_sample PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_late_opens_sample PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_early_closes_sample PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_early_closes_sample_time PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_early_closes_weekdays PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_early_closes_weekdays_time PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_non_early_closes_sample PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_non_early_closes_sample_time PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_late_opens PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_early_closes PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_session_open_close_break_start_end PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_session_has_break PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_next_prev_session PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_session_offset PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_is_session PASSED [ 52%] tests/test_xkar_calendar.py::TestXKARCalendar::test_date_to_session PASSED [ 53%] tests/test_xkar_calendar.py::TestXKARCalendar::test_prev_next_open_close PASSED [ 53%] tests/test_xkar_calendar.py::TestXKARCalendar::test_sessions_in_range PASSED [ 53%] tests/test_xkar_calendar.py::TestXKARCalendar::test_sessions_has_break PASSED [ 53%] tests/test_xkar_calendar.py::TestXKARCalendar::test_sessions_window PASSED [ 53%] tests/test_xkar_calendar.py::TestXKARCalendar::test_sessions_distance PASSED [ 53%] tests/test_xkar_calendar.py::TestXKARCalendar::test_trading_index FAILED [ 53%] tests/test_xkar_calendar.py::TestXKARCalendar::test_deprecated PASSED [ 53%] tests/test_xkar_calendar.py::TestXKARCalendar::test_holidays_in_year[2019-holidays0] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_testbase_integrity PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_base_integrity PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_calculated_against_csv PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_start_end PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_invalid_input PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_bound_min PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_bound_max PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_sanity_check_session_lengths PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_adhoc_holidays_specification PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_daylight_savings PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_sessions PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_opens_closes_break_starts_ends PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minutes_properties[both] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minutes[both] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_calendar_bounds_properties[both] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_session_minute_methods[both] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_session_minutes[both] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_is_trading_minute[both] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_is_break_minute[both] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_is_open_on_minute[both] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_is_open_at_time[both] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_prev_next_minute[both] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_to_session[both-next] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_to_trading_minute[both-next] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_to_session[left-next] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_to_trading_minute[left-next] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minutes_properties[left] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minutes[left] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_calendar_bounds_properties[left] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_session_minute_methods[left] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_session_minutes[left] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_is_trading_minute[left] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_is_break_minute[left] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_is_open_on_minute[left] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_is_open_at_time[left] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_prev_next_minute[left] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_to_session[left-previous] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_to_session[both-previous] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_to_session[right-previous] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_to_session[right-next] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_to_trading_minute[right-next] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minutes_properties[right] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minutes[right] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_calendar_bounds_properties[right] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_session_minute_methods[right] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_session_minutes[right] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_is_trading_minute[right] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_is_break_minute[right] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_is_open_on_minute[right] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_is_open_at_time[right] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_prev_next_minute[right] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_to_session[right-none] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_to_trading_minute[right-none] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_to_session[left-none] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_to_trading_minute[left-none] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_to_session[both-none] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_to_trading_minute[both-none] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_to_session[neither-none] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_to_session[neither-previous] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_to_session[neither-next] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minutes_properties[neither] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minutes[neither] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_calendar_bounds_properties[neither] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_session_minute_methods[neither] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_session_minutes[neither] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_is_trading_minute[neither] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_is_break_minute[neither] PASSED [ 53%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_is_open_on_minute[neither] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_is_open_at_time[neither] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_prev_next_minute[neither] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_to_past_session[neither] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_to_future_session[neither] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_offset[neither] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_offset_by_sessions[neither] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minutes_in_range[neither] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minutes_window[neither] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minutes_distance[neither] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minutes_to_sessions[neither] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_sessions_minutes[neither] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_sessions_minutes_count[neither] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_to_past_session[right] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_to_future_session[right] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_offset[right] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_offset_by_sessions[right] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minutes_in_range[right] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minutes_window[right] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minutes_distance[right] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minutes_to_sessions[right] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_sessions_minutes[right] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_sessions_minutes_count[right] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_to_past_session[left] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_to_future_session[left] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_offset[left] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_offset_by_sessions[left] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minutes_in_range[left] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minutes_window[left] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minutes_distance[left] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minutes_to_sessions[left] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_sessions_minutes[left] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_sessions_minutes_count[left] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_to_past_session[both] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_to_future_session[both] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_offset[both] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minute_offset_by_sessions[both] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minutes_in_range[both] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minutes_window[both] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minutes_distance[both] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_minutes_to_sessions[both] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_sessions_minutes[both] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_sessions_minutes_count[both] PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_has_break PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_regular_holidays_sample PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_adhoc_holidays_sample PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_non_holidays_sample PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_late_opens_sample PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_early_closes_sample PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_early_closes_sample_time PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_early_closes_weekdays PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_early_closes_weekdays_time PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_non_early_closes_sample PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_non_early_closes_sample_time PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_late_opens PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_early_closes PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_session_open_close_break_start_end PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_session_has_break PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_next_prev_session PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_session_offset PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_is_session PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_date_to_session PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_prev_next_open_close PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_sessions_in_range PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_sessions_has_break PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_sessions_window PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_sessions_distance PASSED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_trading_index FAILED [ 54%] tests/test_xkls_calendar.py::TestXKLSCalendar::test_deprecated PASSED [ 54%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_testbase_integrity PASSED [ 54%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_base_integrity PASSED [ 54%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_calculated_against_csv PASSED [ 54%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_start_end PASSED [ 54%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_invalid_input PASSED [ 54%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_bound_min PASSED [ 54%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_bound_max PASSED [ 54%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_sanity_check_session_lengths PASSED [ 54%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_adhoc_holidays_specification PASSED [ 54%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_daylight_savings PASSED [ 54%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_sessions PASSED [ 54%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_opens_closes_break_starts_ends PASSED [ 54%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minutes_properties[both] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minutes[both] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_calendar_bounds_properties[both] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_session_minute_methods[both] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_session_minutes[both] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_is_trading_minute[both] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_is_break_minute[both] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_is_open_on_minute[both] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_is_open_at_time[both] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_prev_next_minute[both] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_to_session[both-next] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_to_trading_minute[both-next] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_to_session[left-next] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_to_trading_minute[left-next] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minutes_properties[left] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minutes[left] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_calendar_bounds_properties[left] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_session_minute_methods[left] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_session_minutes[left] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_is_trading_minute[left] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_is_break_minute[left] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_is_open_on_minute[left] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_is_open_at_time[left] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_prev_next_minute[left] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_to_session[left-previous] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_to_session[both-previous] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_to_session[right-previous] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_to_session[right-next] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_to_trading_minute[right-next] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minutes_properties[right] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minutes[right] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_calendar_bounds_properties[right] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_session_minute_methods[right] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_session_minutes[right] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_is_trading_minute[right] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_is_break_minute[right] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_is_open_on_minute[right] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_is_open_at_time[right] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_prev_next_minute[right] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_to_session[right-none] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_to_trading_minute[right-none] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_to_session[left-none] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_to_trading_minute[left-none] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_to_session[both-none] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_to_trading_minute[both-none] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_to_session[neither-none] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_to_session[neither-previous] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_to_session[neither-next] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minutes_properties[neither] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minutes[neither] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_calendar_bounds_properties[neither] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_session_minute_methods[neither] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_session_minutes[neither] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_is_trading_minute[neither] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_is_break_minute[neither] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_is_open_on_minute[neither] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_is_open_at_time[neither] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_prev_next_minute[neither] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_to_past_session[neither] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_to_future_session[neither] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_offset[neither] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_offset_by_sessions[neither] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minutes_in_range[neither] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minutes_window[neither] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minutes_distance[neither] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minutes_to_sessions[neither] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_sessions_minutes[neither] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_sessions_minutes_count[neither] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_to_past_session[right] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_to_future_session[right] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_offset[right] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_offset_by_sessions[right] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minutes_in_range[right] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minutes_window[right] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minutes_distance[right] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minutes_to_sessions[right] PASSED [ 55%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_sessions_minutes[right] PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_sessions_minutes_count[right] PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_to_past_session[left] PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_to_future_session[left] PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_offset[left] PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_offset_by_sessions[left] PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minutes_in_range[left] PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minutes_window[left] PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minutes_distance[left] PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minutes_to_sessions[left] PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_sessions_minutes[left] PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_sessions_minutes_count[left] PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_to_past_session[both] PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_to_future_session[both] PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_offset[both] PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minute_offset_by_sessions[both] PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minutes_in_range[both] PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minutes_window[both] PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minutes_distance[both] PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_minutes_to_sessions[both] PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_sessions_minutes[both] PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_sessions_minutes_count[both] PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_has_break PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_regular_holidays_sample PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_adhoc_holidays_sample PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_non_holidays_sample PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_late_opens_sample PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_early_closes_sample PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_early_closes_sample_time PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_early_closes_weekdays PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_early_closes_weekdays_time PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_non_early_closes_sample PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_non_early_closes_sample_time PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_early_closes PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_session_open_close_break_start_end PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_session_has_break PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_next_prev_session PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_session_offset PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_is_session PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_date_to_session PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_prev_next_open_close PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_sessions_in_range PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_sessions_has_break PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_sessions_window PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_sessions_distance PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_trading_index FAILED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_deprecated PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_late_opens XFAIL [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_historical_regular_holidays_fall_into_precomputed_holidays PASSED [ 56%] tests/test_xkrx_calendar.py::TestXKRXCalendar::test_feb_29_2022_in_lunar_calendar PASSED [ 56%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_testbase_integrity PASSED [ 56%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_base_integrity PASSED [ 56%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_calculated_against_csv PASSED [ 56%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_start_end PASSED [ 56%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_invalid_input PASSED [ 56%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_bound_min PASSED [ 56%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_bound_max PASSED [ 56%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_sanity_check_session_lengths PASSED [ 56%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_adhoc_holidays_specification PASSED [ 56%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_daylight_savings PASSED [ 56%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_sessions PASSED [ 56%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_opens_closes_break_starts_ends PASSED [ 56%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minutes_properties[both] PASSED [ 56%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minutes[both] PASSED [ 56%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_calendar_bounds_properties[both] PASSED [ 56%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_session_minute_methods[both] PASSED [ 56%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_session_minutes[both] PASSED [ 56%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_is_trading_minute[both] PASSED [ 56%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_is_break_minute[both] PASSED [ 56%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_is_open_on_minute[both] PASSED [ 56%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_is_open_at_time[both] PASSED [ 56%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_prev_next_minute[both] PASSED [ 56%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_to_session[both-next] PASSED [ 56%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_to_trading_minute[both-next] PASSED [ 56%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_to_session[left-next] PASSED [ 56%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_to_trading_minute[left-next] PASSED [ 56%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minutes_properties[left] PASSED [ 56%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minutes[left] PASSED [ 56%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_calendar_bounds_properties[left] PASSED [ 56%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_session_minute_methods[left] PASSED [ 56%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_session_minutes[left] PASSED [ 56%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_is_trading_minute[left] PASSED [ 56%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_is_break_minute[left] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_is_open_on_minute[left] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_is_open_at_time[left] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_prev_next_minute[left] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_to_session[left-previous] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_to_session[both-previous] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_to_session[right-previous] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_to_session[right-next] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_to_trading_minute[right-next] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minutes_properties[right] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minutes[right] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_calendar_bounds_properties[right] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_session_minute_methods[right] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_session_minutes[right] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_is_trading_minute[right] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_is_break_minute[right] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_is_open_on_minute[right] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_is_open_at_time[right] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_prev_next_minute[right] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_to_session[right-none] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_to_trading_minute[right-none] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_to_session[left-none] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_to_trading_minute[left-none] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_to_session[both-none] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_to_trading_minute[both-none] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_to_session[neither-none] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_to_session[neither-previous] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_to_session[neither-next] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minutes_properties[neither] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minutes[neither] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_calendar_bounds_properties[neither] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_session_minute_methods[neither] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_session_minutes[neither] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_is_trading_minute[neither] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_is_break_minute[neither] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_is_open_on_minute[neither] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_is_open_at_time[neither] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_prev_next_minute[neither] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_to_past_session[neither] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_to_future_session[neither] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_offset[neither] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_offset_by_sessions[neither] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minutes_in_range[neither] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minutes_window[neither] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minutes_distance[neither] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minutes_to_sessions[neither] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_sessions_minutes[neither] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_sessions_minutes_count[neither] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_to_past_session[right] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_to_future_session[right] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_offset[right] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_offset_by_sessions[right] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minutes_in_range[right] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minutes_window[right] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minutes_distance[right] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minutes_to_sessions[right] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_sessions_minutes[right] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_sessions_minutes_count[right] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_to_past_session[left] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_to_future_session[left] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_offset[left] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_offset_by_sessions[left] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minutes_in_range[left] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minutes_window[left] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minutes_distance[left] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minutes_to_sessions[left] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_sessions_minutes[left] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_sessions_minutes_count[left] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_to_past_session[both] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_to_future_session[both] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_offset[both] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minute_offset_by_sessions[both] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minutes_in_range[both] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minutes_window[both] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minutes_distance[both] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_minutes_to_sessions[both] PASSED [ 57%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_sessions_minutes[both] PASSED [ 58%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_sessions_minutes_count[both] PASSED [ 58%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_has_break PASSED [ 58%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_regular_holidays_sample PASSED [ 58%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_adhoc_holidays_sample PASSED [ 58%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_non_holidays_sample PASSED [ 58%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_late_opens_sample PASSED [ 58%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_early_closes_sample PASSED [ 58%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_early_closes_sample_time PASSED [ 58%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_early_closes_weekdays PASSED [ 58%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_early_closes_weekdays_time PASSED [ 58%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_non_early_closes_sample PASSED [ 58%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_non_early_closes_sample_time PASSED [ 58%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_late_opens PASSED [ 58%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_early_closes PASSED [ 58%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_session_open_close_break_start_end PASSED [ 58%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_session_has_break PASSED [ 58%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_next_prev_session PASSED [ 58%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_session_offset PASSED [ 58%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_is_session PASSED [ 58%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_date_to_session PASSED [ 58%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_prev_next_open_close PASSED [ 58%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_sessions_in_range PASSED [ 58%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_sessions_has_break PASSED [ 58%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_sessions_window PASSED [ 58%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_sessions_distance PASSED [ 58%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_trading_index FAILED [ 58%] tests/test_xlim_calendar.py::TestXLIMCalendar::test_deprecated PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_testbase_integrity PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_base_integrity PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_calculated_against_csv PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_start_end PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_invalid_input PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_bound_min PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_bound_max PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_sanity_check_session_lengths PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_adhoc_holidays_specification PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_daylight_savings PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_sessions PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_opens_closes_break_starts_ends PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minutes_properties[both] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minutes[both] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_calendar_bounds_properties[both] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_session_minute_methods[both] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_session_minutes[both] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_is_trading_minute[both] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_is_break_minute[both] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_is_open_on_minute[both] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_is_open_at_time[both] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_prev_next_minute[both] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_to_session[both-next] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_to_trading_minute[both-next] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_to_session[left-next] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_to_trading_minute[left-next] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minutes_properties[left] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minutes[left] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_calendar_bounds_properties[left] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_session_minute_methods[left] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_session_minutes[left] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_is_trading_minute[left] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_is_break_minute[left] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_is_open_on_minute[left] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_is_open_at_time[left] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_prev_next_minute[left] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_to_session[left-previous] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_to_session[both-previous] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_to_session[right-previous] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_to_session[right-next] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_to_trading_minute[right-next] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minutes_properties[right] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minutes[right] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_calendar_bounds_properties[right] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_session_minute_methods[right] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_session_minutes[right] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_is_trading_minute[right] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_is_break_minute[right] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_is_open_on_minute[right] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_is_open_at_time[right] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_prev_next_minute[right] PASSED [ 58%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_to_session[right-none] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_to_trading_minute[right-none] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_to_session[left-none] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_to_trading_minute[left-none] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_to_session[both-none] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_to_trading_minute[both-none] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_to_session[neither-none] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_to_session[neither-previous] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_to_session[neither-next] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minutes_properties[neither] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minutes[neither] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_calendar_bounds_properties[neither] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_session_minute_methods[neither] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_session_minutes[neither] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_is_trading_minute[neither] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_is_break_minute[neither] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_is_open_on_minute[neither] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_is_open_at_time[neither] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_prev_next_minute[neither] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_to_past_session[neither] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_to_future_session[neither] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_offset[neither] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_offset_by_sessions[neither] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minutes_in_range[neither] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minutes_window[neither] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minutes_distance[neither] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minutes_to_sessions[neither] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_sessions_minutes[neither] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_sessions_minutes_count[neither] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_to_past_session[right] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_to_future_session[right] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_offset[right] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_offset_by_sessions[right] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minutes_in_range[right] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minutes_window[right] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minutes_distance[right] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minutes_to_sessions[right] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_sessions_minutes[right] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_sessions_minutes_count[right] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_to_past_session[left] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_to_future_session[left] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_offset[left] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_offset_by_sessions[left] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minutes_in_range[left] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minutes_window[left] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minutes_distance[left] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minutes_to_sessions[left] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_sessions_minutes[left] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_sessions_minutes_count[left] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_to_past_session[both] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_to_future_session[both] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_offset[both] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minute_offset_by_sessions[both] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minutes_in_range[both] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minutes_window[both] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minutes_distance[both] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_minutes_to_sessions[both] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_sessions_minutes[both] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_sessions_minutes_count[both] PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_has_break PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_regular_holidays_sample PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_adhoc_holidays_sample PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_non_holidays_sample PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_late_opens_sample PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_early_closes_sample PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_early_closes_sample_time PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_early_closes_weekdays PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_early_closes_weekdays_time PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_non_early_closes_sample PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_non_early_closes_sample_time PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_late_opens PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_early_closes PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_session_open_close_break_start_end PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_session_has_break PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_next_prev_session PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_session_offset PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_is_session PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_date_to_session PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_prev_next_open_close PASSED [ 59%] tests/test_xlis_calendar.py::TestXLISCalendar::test_sessions_in_range PASSED [ 60%] tests/test_xlis_calendar.py::TestXLISCalendar::test_sessions_has_break PASSED [ 60%] tests/test_xlis_calendar.py::TestXLISCalendar::test_sessions_window PASSED [ 60%] tests/test_xlis_calendar.py::TestXLISCalendar::test_sessions_distance PASSED [ 60%] tests/test_xlis_calendar.py::TestXLISCalendar::test_trading_index FAILED [ 60%] tests/test_xlis_calendar.py::TestXLISCalendar::test_deprecated PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_testbase_integrity PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_base_integrity PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_calculated_against_csv PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_start_end PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_invalid_input PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_bound_min PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_bound_max PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_sanity_check_session_lengths PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_adhoc_holidays_specification PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_daylight_savings PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_sessions PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_opens_closes_break_starts_ends PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minutes_properties[both] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minutes[both] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_calendar_bounds_properties[both] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_session_minute_methods[both] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_session_minutes[both] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_is_trading_minute[both] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_is_break_minute[both] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_is_open_on_minute[both] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_is_open_at_time[both] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_prev_next_minute[both] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_to_session[both-next] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_to_trading_minute[both-next] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_to_session[left-next] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_to_trading_minute[left-next] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minutes_properties[left] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minutes[left] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_calendar_bounds_properties[left] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_session_minute_methods[left] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_session_minutes[left] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_is_trading_minute[left] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_is_break_minute[left] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_is_open_on_minute[left] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_is_open_at_time[left] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_prev_next_minute[left] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_to_session[left-previous] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_to_session[both-previous] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_to_session[right-previous] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_to_session[right-next] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_to_trading_minute[right-next] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minutes_properties[right] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minutes[right] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_calendar_bounds_properties[right] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_session_minute_methods[right] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_session_minutes[right] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_is_trading_minute[right] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_is_break_minute[right] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_is_open_on_minute[right] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_is_open_at_time[right] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_prev_next_minute[right] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_to_session[right-none] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_to_trading_minute[right-none] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_to_session[left-none] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_to_trading_minute[left-none] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_to_session[both-none] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_to_trading_minute[both-none] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_to_session[neither-none] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_to_session[neither-previous] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_to_session[neither-next] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minutes_properties[neither] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minutes[neither] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_calendar_bounds_properties[neither] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_session_minute_methods[neither] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_session_minutes[neither] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_is_trading_minute[neither] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_is_break_minute[neither] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_is_open_on_minute[neither] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_is_open_at_time[neither] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_prev_next_minute[neither] PASSED [ 60%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_to_past_session[neither] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_to_future_session[neither] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_offset[neither] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_offset_by_sessions[neither] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minutes_in_range[neither] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minutes_window[neither] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minutes_distance[neither] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minutes_to_sessions[neither] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_sessions_minutes[neither] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_sessions_minutes_count[neither] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_to_past_session[right] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_to_future_session[right] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_offset[right] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_offset_by_sessions[right] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minutes_in_range[right] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minutes_window[right] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minutes_distance[right] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minutes_to_sessions[right] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_sessions_minutes[right] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_sessions_minutes_count[right] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_to_past_session[left] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_to_future_session[left] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_offset[left] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_offset_by_sessions[left] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minutes_in_range[left] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minutes_window[left] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minutes_distance[left] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minutes_to_sessions[left] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_sessions_minutes[left] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_sessions_minutes_count[left] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_to_past_session[both] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_to_future_session[both] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_offset[both] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minute_offset_by_sessions[both] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minutes_in_range[both] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minutes_window[both] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minutes_distance[both] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_minutes_to_sessions[both] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_sessions_minutes[both] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_sessions_minutes_count[both] PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_has_break PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_regular_holidays_sample PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_adhoc_holidays_sample PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_non_holidays_sample PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_late_opens_sample PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_early_closes_sample PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_early_closes_sample_time PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_early_closes_weekdays PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_early_closes_weekdays_time PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_non_early_closes_sample PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_non_early_closes_sample_time PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_late_opens PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_early_closes PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_session_open_close_break_start_end PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_session_has_break PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_next_prev_session PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_session_offset PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_is_session PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_date_to_session PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_prev_next_open_close PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_sessions_in_range PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_sessions_has_break PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_sessions_window PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_sessions_distance PASSED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_trading_index FAILED [ 61%] tests/test_xlon_calendar.py::TestXLONCalendar::test_deprecated PASSED [ 61%] tests/test_xmad_calendar.py::TestXMADCalendar::test_testbase_integrity PASSED [ 61%] tests/test_xmad_calendar.py::TestXMADCalendar::test_base_integrity PASSED [ 61%] tests/test_xmad_calendar.py::TestXMADCalendar::test_calculated_against_csv PASSED [ 61%] tests/test_xmad_calendar.py::TestXMADCalendar::test_start_end PASSED [ 61%] tests/test_xmad_calendar.py::TestXMADCalendar::test_invalid_input PASSED [ 61%] tests/test_xmad_calendar.py::TestXMADCalendar::test_bound_min PASSED [ 61%] tests/test_xmad_calendar.py::TestXMADCalendar::test_bound_max PASSED [ 61%] tests/test_xmad_calendar.py::TestXMADCalendar::test_sanity_check_session_lengths PASSED [ 61%] tests/test_xmad_calendar.py::TestXMADCalendar::test_adhoc_holidays_specification PASSED [ 61%] tests/test_xmad_calendar.py::TestXMADCalendar::test_daylight_savings PASSED [ 61%] tests/test_xmad_calendar.py::TestXMADCalendar::test_sessions PASSED [ 61%] tests/test_xmad_calendar.py::TestXMADCalendar::test_opens_closes_break_starts_ends PASSED [ 61%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minutes_properties[both] PASSED [ 61%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minutes[both] PASSED [ 61%] tests/test_xmad_calendar.py::TestXMADCalendar::test_calendar_bounds_properties[both] PASSED [ 61%] tests/test_xmad_calendar.py::TestXMADCalendar::test_session_minute_methods[both] PASSED [ 61%] tests/test_xmad_calendar.py::TestXMADCalendar::test_session_minutes[both] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_is_trading_minute[both] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_is_break_minute[both] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_is_open_on_minute[both] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_is_open_at_time[both] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_prev_next_minute[both] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_to_session[both-next] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_to_trading_minute[both-next] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_to_session[left-next] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_to_trading_minute[left-next] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minutes_properties[left] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minutes[left] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_calendar_bounds_properties[left] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_session_minute_methods[left] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_session_minutes[left] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_is_trading_minute[left] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_is_break_minute[left] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_is_open_on_minute[left] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_is_open_at_time[left] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_prev_next_minute[left] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_to_session[left-previous] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_to_session[both-previous] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_to_session[right-previous] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_to_session[right-next] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_to_trading_minute[right-next] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minutes_properties[right] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minutes[right] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_calendar_bounds_properties[right] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_session_minute_methods[right] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_session_minutes[right] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_is_trading_minute[right] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_is_break_minute[right] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_is_open_on_minute[right] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_is_open_at_time[right] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_prev_next_minute[right] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_to_session[right-none] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_to_trading_minute[right-none] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_to_session[left-none] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_to_trading_minute[left-none] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_to_session[both-none] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_to_trading_minute[both-none] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_to_session[neither-none] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_to_session[neither-previous] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_to_session[neither-next] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minutes_properties[neither] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minutes[neither] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_calendar_bounds_properties[neither] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_session_minute_methods[neither] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_session_minutes[neither] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_is_trading_minute[neither] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_is_break_minute[neither] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_is_open_on_minute[neither] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_is_open_at_time[neither] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_prev_next_minute[neither] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_to_past_session[neither] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_to_future_session[neither] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_offset[neither] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_offset_by_sessions[neither] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minutes_in_range[neither] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minutes_window[neither] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minutes_distance[neither] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minutes_to_sessions[neither] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_sessions_minutes[neither] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_sessions_minutes_count[neither] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_to_past_session[right] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_to_future_session[right] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_offset[right] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_offset_by_sessions[right] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minutes_in_range[right] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minutes_window[right] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minutes_distance[right] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minutes_to_sessions[right] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_sessions_minutes[right] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_sessions_minutes_count[right] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_to_past_session[left] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_to_future_session[left] PASSED [ 62%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_offset[left] PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_offset_by_sessions[left] PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minutes_in_range[left] PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minutes_window[left] PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minutes_distance[left] PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minutes_to_sessions[left] PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_sessions_minutes[left] PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_sessions_minutes_count[left] PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_to_past_session[both] PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_to_future_session[both] PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_offset[both] PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minute_offset_by_sessions[both] PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minutes_in_range[both] PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minutes_window[both] PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minutes_distance[both] PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_minutes_to_sessions[both] PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_sessions_minutes[both] PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_sessions_minutes_count[both] PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_has_break PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_regular_holidays_sample PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_adhoc_holidays_sample PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_non_holidays_sample PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_late_opens_sample PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_early_closes_sample PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_early_closes_sample_time PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_early_closes_weekdays PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_early_closes_weekdays_time PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_non_early_closes_sample PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_non_early_closes_sample_time PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_late_opens PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_early_closes PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_session_open_close_break_start_end PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_session_has_break PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_next_prev_session PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_session_offset PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_is_session PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_date_to_session PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_prev_next_open_close PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_sessions_in_range PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_sessions_has_break PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_sessions_window PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_sessions_distance PASSED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_trading_index FAILED [ 63%] tests/test_xmad_calendar.py::TestXMADCalendar::test_deprecated PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_testbase_integrity PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_base_integrity PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_calculated_against_csv PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_start_end PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_invalid_input PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_bound_min PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_bound_max PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_sanity_check_session_lengths PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_adhoc_holidays_specification PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_daylight_savings PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_sessions PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_opens_closes_break_starts_ends PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minutes_properties[both] PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minutes[both] PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_calendar_bounds_properties[both] PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_session_minute_methods[both] PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_session_minutes[both] PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_is_trading_minute[both] PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_is_break_minute[both] PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_is_open_on_minute[both] PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_is_open_at_time[both] PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_prev_next_minute[both] PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_to_session[both-next] PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_to_trading_minute[both-next] PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_to_session[left-next] PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_to_trading_minute[left-next] PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minutes_properties[left] PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minutes[left] PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_calendar_bounds_properties[left] PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_session_minute_methods[left] PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_session_minutes[left] PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_is_trading_minute[left] PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_is_break_minute[left] PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_is_open_on_minute[left] PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_is_open_at_time[left] PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_prev_next_minute[left] PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_to_session[left-previous] PASSED [ 63%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_to_session[both-previous] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_to_session[right-previous] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_to_session[right-next] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_to_trading_minute[right-next] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minutes_properties[right] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minutes[right] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_calendar_bounds_properties[right] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_session_minute_methods[right] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_session_minutes[right] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_is_trading_minute[right] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_is_break_minute[right] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_is_open_on_minute[right] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_is_open_at_time[right] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_prev_next_minute[right] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_to_session[right-none] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_to_trading_minute[right-none] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_to_session[left-none] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_to_trading_minute[left-none] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_to_session[both-none] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_to_trading_minute[both-none] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_to_session[neither-none] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_to_session[neither-previous] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_to_session[neither-next] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minutes_properties[neither] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minutes[neither] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_calendar_bounds_properties[neither] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_session_minute_methods[neither] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_session_minutes[neither] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_is_trading_minute[neither] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_is_break_minute[neither] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_is_open_on_minute[neither] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_is_open_at_time[neither] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_prev_next_minute[neither] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_to_past_session[neither] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_to_future_session[neither] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_offset[neither] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_offset_by_sessions[neither] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minutes_in_range[neither] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minutes_window[neither] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minutes_distance[neither] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minutes_to_sessions[neither] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_sessions_minutes[neither] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_sessions_minutes_count[neither] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_to_past_session[right] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_to_future_session[right] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_offset[right] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_offset_by_sessions[right] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minutes_in_range[right] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minutes_window[right] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minutes_distance[right] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minutes_to_sessions[right] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_sessions_minutes[right] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_sessions_minutes_count[right] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_to_past_session[left] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_to_future_session[left] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_offset[left] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_offset_by_sessions[left] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minutes_in_range[left] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minutes_window[left] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minutes_distance[left] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minutes_to_sessions[left] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_sessions_minutes[left] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_sessions_minutes_count[left] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_to_past_session[both] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_to_future_session[both] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_offset[both] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minute_offset_by_sessions[both] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minutes_in_range[both] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minutes_window[both] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minutes_distance[both] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_minutes_to_sessions[both] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_sessions_minutes[both] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_sessions_minutes_count[both] PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_has_break PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_regular_holidays_sample PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_adhoc_holidays_sample PASSED [ 64%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_non_holidays_sample PASSED [ 65%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_late_opens_sample PASSED [ 65%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_early_closes_sample PASSED [ 65%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_early_closes_sample_time PASSED [ 65%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_early_closes_weekdays PASSED [ 65%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_early_closes_weekdays_time PASSED [ 65%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_non_early_closes_sample PASSED [ 65%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_non_early_closes_sample_time PASSED [ 65%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_late_opens PASSED [ 65%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_early_closes PASSED [ 65%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_session_open_close_break_start_end PASSED [ 65%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_session_has_break PASSED [ 65%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_next_prev_session PASSED [ 65%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_session_offset PASSED [ 65%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_is_session PASSED [ 65%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_date_to_session PASSED [ 65%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_prev_next_open_close PASSED [ 65%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_sessions_in_range PASSED [ 65%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_sessions_has_break PASSED [ 65%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_sessions_window PASSED [ 65%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_sessions_distance PASSED [ 65%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_trading_index FAILED [ 65%] tests/test_xmex_calendar.py::TestXMEXCalendar::test_deprecated PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_testbase_integrity PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_base_integrity PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_calculated_against_csv PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_start_end PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_invalid_input PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_bound_min PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_bound_max PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_sanity_check_session_lengths PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_adhoc_holidays_specification PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_daylight_savings PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_sessions PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_opens_closes_break_starts_ends PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minutes_properties[both] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minutes[both] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_calendar_bounds_properties[both] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_session_minute_methods[both] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_session_minutes[both] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_is_trading_minute[both] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_is_break_minute[both] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_is_open_on_minute[both] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_is_open_at_time[both] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_prev_next_minute[both] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_to_session[both-next] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_to_trading_minute[both-next] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_to_session[left-next] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_to_trading_minute[left-next] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minutes_properties[left] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minutes[left] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_calendar_bounds_properties[left] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_session_minute_methods[left] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_session_minutes[left] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_is_trading_minute[left] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_is_break_minute[left] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_is_open_on_minute[left] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_is_open_at_time[left] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_prev_next_minute[left] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_to_session[left-previous] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_to_session[both-previous] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_to_session[right-previous] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_to_session[right-next] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_to_trading_minute[right-next] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minutes_properties[right] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minutes[right] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_calendar_bounds_properties[right] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_session_minute_methods[right] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_session_minutes[right] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_is_trading_minute[right] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_is_break_minute[right] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_is_open_on_minute[right] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_is_open_at_time[right] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_prev_next_minute[right] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_to_session[right-none] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_to_trading_minute[right-none] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_to_session[left-none] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_to_trading_minute[left-none] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_to_session[both-none] PASSED [ 65%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_to_trading_minute[both-none] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_to_session[neither-none] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_to_session[neither-previous] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_to_session[neither-next] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minutes_properties[neither] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minutes[neither] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_calendar_bounds_properties[neither] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_session_minute_methods[neither] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_session_minutes[neither] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_is_trading_minute[neither] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_is_break_minute[neither] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_is_open_on_minute[neither] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_is_open_at_time[neither] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_prev_next_minute[neither] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_to_past_session[neither] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_to_future_session[neither] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_offset[neither] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_offset_by_sessions[neither] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minutes_in_range[neither] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minutes_window[neither] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minutes_distance[neither] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minutes_to_sessions[neither] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_sessions_minutes[neither] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_sessions_minutes_count[neither] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_to_past_session[right] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_to_future_session[right] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_offset[right] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_offset_by_sessions[right] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minutes_in_range[right] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minutes_window[right] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minutes_distance[right] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minutes_to_sessions[right] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_sessions_minutes[right] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_sessions_minutes_count[right] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_to_past_session[left] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_to_future_session[left] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_offset[left] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_offset_by_sessions[left] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minutes_in_range[left] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minutes_window[left] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minutes_distance[left] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minutes_to_sessions[left] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_sessions_minutes[left] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_sessions_minutes_count[left] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_to_past_session[both] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_to_future_session[both] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_offset[both] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minute_offset_by_sessions[both] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minutes_in_range[both] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minutes_window[both] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minutes_distance[both] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_minutes_to_sessions[both] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_sessions_minutes[both] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_sessions_minutes_count[both] PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_has_break PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_regular_holidays_sample PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_adhoc_holidays_sample PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_non_holidays_sample PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_late_opens_sample PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_early_closes_sample PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_early_closes_sample_time PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_early_closes_weekdays PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_early_closes_weekdays_time PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_non_early_closes_sample PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_non_early_closes_sample_time PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_late_opens PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_early_closes PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_session_open_close_break_start_end PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_session_has_break PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_next_prev_session PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_session_offset PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_is_session PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_date_to_session PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_prev_next_open_close PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_sessions_in_range PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_sessions_has_break PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_sessions_window PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_sessions_distance PASSED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_trading_index FAILED [ 66%] tests/test_xmil_calendar.py::TestXMILCalendar::test_deprecated PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_testbase_integrity PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_base_integrity PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_calculated_against_csv PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_start_end PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_invalid_input PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_bound_min PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_bound_max PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_sanity_check_session_lengths PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_adhoc_holidays_specification PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_daylight_savings PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_sessions PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_opens_closes_break_starts_ends PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minutes_properties[both] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minutes[both] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_calendar_bounds_properties[both] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_session_minute_methods[both] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_session_minutes[both] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_is_trading_minute[both] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_is_break_minute[both] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_is_open_on_minute[both] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_is_open_at_time[both] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_prev_next_minute[both] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_to_session[both-next] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_to_trading_minute[both-next] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_to_session[left-next] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_to_trading_minute[left-next] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minutes_properties[left] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minutes[left] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_calendar_bounds_properties[left] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_session_minute_methods[left] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_session_minutes[left] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_is_trading_minute[left] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_is_break_minute[left] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_is_open_on_minute[left] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_is_open_at_time[left] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_prev_next_minute[left] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_to_session[left-previous] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_to_session[both-previous] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_to_session[right-previous] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_to_session[right-next] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_to_trading_minute[right-next] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minutes_properties[right] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minutes[right] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_calendar_bounds_properties[right] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_session_minute_methods[right] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_session_minutes[right] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_is_trading_minute[right] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_is_break_minute[right] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_is_open_on_minute[right] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_is_open_at_time[right] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_prev_next_minute[right] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_to_session[right-none] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_to_trading_minute[right-none] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_to_session[left-none] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_to_trading_minute[left-none] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_to_session[both-none] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_to_trading_minute[both-none] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_to_session[neither-none] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_to_session[neither-previous] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_to_session[neither-next] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minutes_properties[neither] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minutes[neither] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_calendar_bounds_properties[neither] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_session_minute_methods[neither] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_session_minutes[neither] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_is_trading_minute[neither] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_is_break_minute[neither] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_is_open_on_minute[neither] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_is_open_at_time[neither] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_prev_next_minute[neither] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_to_past_session[neither] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_to_future_session[neither] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_offset[neither] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_offset_by_sessions[neither] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minutes_in_range[neither] PASSED [ 67%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minutes_window[neither] PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minutes_distance[neither] PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minutes_to_sessions[neither] PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_sessions_minutes[neither] PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_sessions_minutes_count[neither] PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_to_past_session[right] PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_to_future_session[right] PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_offset[right] PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_offset_by_sessions[right] PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minutes_in_range[right] PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minutes_window[right] PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minutes_distance[right] PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minutes_to_sessions[right] PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_sessions_minutes[right] PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_sessions_minutes_count[right] PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_to_past_session[left] PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_to_future_session[left] PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_offset[left] PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_offset_by_sessions[left] PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minutes_in_range[left] PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minutes_window[left] PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minutes_distance[left] PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minutes_to_sessions[left] PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_sessions_minutes[left] PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_sessions_minutes_count[left] PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_to_past_session[both] PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_to_future_session[both] PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_offset[both] PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minute_offset_by_sessions[both] PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minutes_in_range[both] PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minutes_window[both] PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minutes_distance[both] PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_minutes_to_sessions[both] PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_sessions_minutes[both] PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_sessions_minutes_count[both] PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_has_break PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_regular_holidays_sample PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_adhoc_holidays_sample PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_non_holidays_sample PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_late_opens_sample PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_early_closes_sample PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_early_closes_sample_time PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_early_closes_weekdays PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_early_closes_weekdays_time PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_non_early_closes_sample PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_non_early_closes_sample_time PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_late_opens PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_early_closes PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_session_open_close_break_start_end PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_session_has_break PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_next_prev_session PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_session_offset PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_is_session PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_date_to_session PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_prev_next_open_close PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_sessions_in_range PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_sessions_has_break PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_sessions_window PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_sessions_distance PASSED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_trading_index FAILED [ 68%] tests/test_xmos_calendar.py::TestXMOSCalendar::test_deprecated PASSED [ 68%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_testbase_integrity PASSED [ 68%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_base_integrity PASSED [ 68%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_calculated_against_csv PASSED [ 68%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_start_end PASSED [ 68%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_invalid_input PASSED [ 68%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_bound_min PASSED [ 68%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_bound_max PASSED [ 68%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_sanity_check_session_lengths PASSED [ 68%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_adhoc_holidays_specification PASSED [ 68%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_daylight_savings PASSED [ 68%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_sessions PASSED [ 68%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_opens_closes_break_starts_ends PASSED [ 68%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minutes_properties[both] PASSED [ 68%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minutes[both] PASSED [ 68%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_calendar_bounds_properties[both] PASSED [ 68%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_session_minute_methods[both] PASSED [ 68%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_session_minutes[both] PASSED [ 68%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_is_trading_minute[both] PASSED [ 68%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_is_break_minute[both] PASSED [ 68%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_is_open_on_minute[both] PASSED [ 68%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_is_open_at_time[both] PASSED [ 68%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_prev_next_minute[both] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_to_session[both-next] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_to_trading_minute[both-next] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_to_session[left-next] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_to_trading_minute[left-next] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minutes_properties[left] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minutes[left] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_calendar_bounds_properties[left] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_session_minute_methods[left] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_session_minutes[left] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_is_trading_minute[left] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_is_break_minute[left] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_is_open_on_minute[left] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_is_open_at_time[left] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_prev_next_minute[left] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_to_session[left-previous] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_to_session[both-previous] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_to_session[right-previous] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_to_session[right-next] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_to_trading_minute[right-next] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minutes_properties[right] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minutes[right] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_calendar_bounds_properties[right] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_session_minute_methods[right] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_session_minutes[right] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_is_trading_minute[right] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_is_break_minute[right] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_is_open_on_minute[right] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_is_open_at_time[right] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_prev_next_minute[right] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_to_session[right-none] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_to_trading_minute[right-none] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_to_session[left-none] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_to_trading_minute[left-none] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_to_session[both-none] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_to_trading_minute[both-none] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_to_session[neither-none] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_to_session[neither-previous] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_to_session[neither-next] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minutes_properties[neither] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minutes[neither] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_calendar_bounds_properties[neither] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_session_minute_methods[neither] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_session_minutes[neither] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_is_trading_minute[neither] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_is_break_minute[neither] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_is_open_on_minute[neither] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_is_open_at_time[neither] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_prev_next_minute[neither] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_to_past_session[neither] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_to_future_session[neither] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_offset[neither] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_offset_by_sessions[neither] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minutes_in_range[neither] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minutes_window[neither] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minutes_distance[neither] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minutes_to_sessions[neither] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_sessions_minutes[neither] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_sessions_minutes_count[neither] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_to_past_session[right] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_to_future_session[right] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_offset[right] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_offset_by_sessions[right] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minutes_in_range[right] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minutes_window[right] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minutes_distance[right] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minutes_to_sessions[right] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_sessions_minutes[right] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_sessions_minutes_count[right] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_to_past_session[left] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_to_future_session[left] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_offset[left] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_offset_by_sessions[left] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minutes_in_range[left] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minutes_window[left] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minutes_distance[left] PASSED [ 69%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minutes_to_sessions[left] PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_sessions_minutes[left] PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_sessions_minutes_count[left] PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_to_past_session[both] PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_to_future_session[both] PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_offset[both] PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minute_offset_by_sessions[both] PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minutes_in_range[both] PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minutes_window[both] PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minutes_distance[both] PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_minutes_to_sessions[both] PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_sessions_minutes[both] PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_sessions_minutes_count[both] PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_has_break PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_regular_holidays_sample PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_adhoc_holidays_sample PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_non_holidays_sample PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_late_opens_sample PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_early_closes_sample PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_early_closes_sample_time PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_early_closes_weekdays PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_early_closes_weekdays_time PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_non_early_closes_sample PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_non_early_closes_sample_time PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_late_opens PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_early_closes PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_session_open_close_break_start_end PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_session_has_break PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_next_prev_session PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_session_offset PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_is_session PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_date_to_session PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_prev_next_open_close PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_sessions_in_range PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_sessions_has_break PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_sessions_window PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_sessions_distance PASSED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_trading_index FAILED [ 70%] tests/test_xnys_calendar.py::TestXNYSCalendar::test_deprecated PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_testbase_integrity PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_base_integrity PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_calculated_against_csv PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_start_end PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_invalid_input PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_bound_min PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_bound_max PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_sanity_check_session_lengths PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_adhoc_holidays_specification PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_daylight_savings PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_sessions PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_opens_closes_break_starts_ends PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minutes_properties[both] PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minutes[both] PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_calendar_bounds_properties[both] PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_session_minute_methods[both] PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_session_minutes[both] PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_is_trading_minute[both] PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_is_break_minute[both] PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_is_open_on_minute[both] PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_is_open_at_time[both] PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_prev_next_minute[both] PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_to_session[both-next] PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_to_trading_minute[both-next] PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_to_session[left-next] PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_to_trading_minute[left-next] PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minutes_properties[left] PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minutes[left] PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_calendar_bounds_properties[left] PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_session_minute_methods[left] PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_session_minutes[left] PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_is_trading_minute[left] PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_is_break_minute[left] PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_is_open_on_minute[left] PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_is_open_at_time[left] PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_prev_next_minute[left] PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_to_session[left-previous] PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_to_trading_minute[left-previous] PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_to_session[both-previous] PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_to_trading_minute[both-previous] PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_to_session[right-previous] PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_to_trading_minute[right-previous] PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_to_session[right-next] PASSED [ 70%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_to_trading_minute[right-next] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minutes_properties[right] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minutes[right] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_calendar_bounds_properties[right] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_session_minute_methods[right] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_session_minutes[right] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_is_trading_minute[right] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_is_break_minute[right] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_is_open_on_minute[right] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_is_open_at_time[right] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_prev_next_minute[right] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_to_session[right-none] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_to_trading_minute[right-none] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_to_session[left-none] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_to_trading_minute[left-none] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_to_session[both-none] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_to_trading_minute[both-none] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_to_session[neither-none] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_to_trading_minute[neither-none] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_to_session[neither-previous] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_to_session[neither-next] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_to_trading_minute[neither-next] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minutes_properties[neither] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minutes[neither] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_calendar_bounds_properties[neither] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_session_minute_methods[neither] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_session_minutes[neither] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_is_trading_minute[neither] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_is_break_minute[neither] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_is_open_on_minute[neither] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_is_open_at_time[neither] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_prev_next_minute[neither] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_to_past_session[neither] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_to_future_session[neither] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_offset[neither] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_offset_by_sessions[neither] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minutes_in_range[neither] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minutes_window[neither] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minutes_distance[neither] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minutes_to_sessions[neither] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_sessions_minutes[neither] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_sessions_minutes_count[neither] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_to_past_session[right] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_to_future_session[right] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_offset[right] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_offset_by_sessions[right] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minutes_in_range[right] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minutes_window[right] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minutes_distance[right] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minutes_to_sessions[right] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_sessions_minutes[right] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_sessions_minutes_count[right] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_to_past_session[left] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_to_future_session[left] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_offset[left] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_offset_by_sessions[left] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minutes_in_range[left] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minutes_window[left] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minutes_distance[left] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minutes_to_sessions[left] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_sessions_minutes[left] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_sessions_minutes_count[left] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_to_past_session[both] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_to_future_session[both] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_offset[both] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minute_offset_by_sessions[both] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minutes_in_range[both] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minutes_window[both] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minutes_distance[both] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_minutes_to_sessions[both] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_sessions_minutes[both] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_sessions_minutes_count[both] PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_has_break PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_regular_holidays_sample PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_adhoc_holidays_sample PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_non_holidays_sample PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_late_opens_sample PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_early_closes_sample PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_early_closes_sample_time PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_early_closes_weekdays PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_early_closes_weekdays_time PASSED [ 71%] tests/test_xnze_calendar.py::TestXNZECalendar::test_non_early_closes_sample PASSED [ 72%] tests/test_xnze_calendar.py::TestXNZECalendar::test_non_early_closes_sample_time PASSED [ 72%] tests/test_xnze_calendar.py::TestXNZECalendar::test_late_opens PASSED [ 72%] tests/test_xnze_calendar.py::TestXNZECalendar::test_early_closes PASSED [ 72%] tests/test_xnze_calendar.py::TestXNZECalendar::test_session_open_close_break_start_end PASSED [ 72%] tests/test_xnze_calendar.py::TestXNZECalendar::test_session_has_break PASSED [ 72%] tests/test_xnze_calendar.py::TestXNZECalendar::test_next_prev_session PASSED [ 72%] tests/test_xnze_calendar.py::TestXNZECalendar::test_session_offset PASSED [ 72%] tests/test_xnze_calendar.py::TestXNZECalendar::test_is_session PASSED [ 72%] tests/test_xnze_calendar.py::TestXNZECalendar::test_date_to_session PASSED [ 72%] tests/test_xnze_calendar.py::TestXNZECalendar::test_prev_next_open_close PASSED [ 72%] tests/test_xnze_calendar.py::TestXNZECalendar::test_sessions_in_range PASSED [ 72%] tests/test_xnze_calendar.py::TestXNZECalendar::test_sessions_has_break PASSED [ 72%] tests/test_xnze_calendar.py::TestXNZECalendar::test_sessions_window PASSED [ 72%] tests/test_xnze_calendar.py::TestXNZECalendar::test_sessions_distance PASSED [ 72%] tests/test_xnze_calendar.py::TestXNZECalendar::test_trading_index FAILED [ 72%] tests/test_xnze_calendar.py::TestXNZECalendar::test_deprecated PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_testbase_integrity PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_base_integrity PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_calculated_against_csv PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_start_end PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_invalid_input PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_bound_min PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_bound_max PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_sanity_check_session_lengths PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_adhoc_holidays_specification PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_daylight_savings PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_sessions PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_opens_closes_break_starts_ends PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minutes_properties[both] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minutes[both] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_calendar_bounds_properties[both] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_session_minute_methods[both] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_session_minutes[both] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_is_trading_minute[both] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_is_break_minute[both] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_is_open_on_minute[both] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_is_open_at_time[both] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_prev_next_minute[both] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_to_session[both-next] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_to_trading_minute[both-next] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_to_session[left-next] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_to_trading_minute[left-next] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minutes_properties[left] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minutes[left] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_calendar_bounds_properties[left] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_session_minute_methods[left] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_session_minutes[left] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_is_trading_minute[left] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_is_break_minute[left] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_is_open_on_minute[left] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_is_open_at_time[left] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_prev_next_minute[left] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_to_session[left-previous] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_to_session[both-previous] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_to_session[right-previous] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_to_session[right-next] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_to_trading_minute[right-next] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minutes_properties[right] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minutes[right] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_calendar_bounds_properties[right] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_session_minute_methods[right] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_session_minutes[right] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_is_trading_minute[right] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_is_break_minute[right] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_is_open_on_minute[right] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_is_open_at_time[right] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_prev_next_minute[right] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_to_session[right-none] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_to_trading_minute[right-none] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_to_session[left-none] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_to_trading_minute[left-none] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_to_session[both-none] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_to_trading_minute[both-none] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_to_session[neither-none] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_to_session[neither-previous] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 72%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_to_session[neither-next] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minutes_properties[neither] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minutes[neither] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_calendar_bounds_properties[neither] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_session_minute_methods[neither] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_session_minutes[neither] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_is_trading_minute[neither] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_is_break_minute[neither] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_is_open_on_minute[neither] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_is_open_at_time[neither] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_prev_next_minute[neither] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_to_past_session[neither] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_to_future_session[neither] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_offset[neither] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_offset_by_sessions[neither] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minutes_in_range[neither] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minutes_window[neither] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minutes_distance[neither] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minutes_to_sessions[neither] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_sessions_minutes[neither] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_sessions_minutes_count[neither] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_to_past_session[right] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_to_future_session[right] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_offset[right] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_offset_by_sessions[right] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minutes_in_range[right] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minutes_window[right] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minutes_distance[right] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minutes_to_sessions[right] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_sessions_minutes[right] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_sessions_minutes_count[right] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_to_past_session[left] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_to_future_session[left] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_offset[left] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_offset_by_sessions[left] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minutes_in_range[left] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minutes_window[left] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minutes_distance[left] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minutes_to_sessions[left] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_sessions_minutes[left] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_sessions_minutes_count[left] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_to_past_session[both] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_to_future_session[both] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_offset[both] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minute_offset_by_sessions[both] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minutes_in_range[both] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minutes_window[both] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minutes_distance[both] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_minutes_to_sessions[both] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_sessions_minutes[both] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_sessions_minutes_count[both] PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_has_break PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_regular_holidays_sample PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_adhoc_holidays_sample PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_non_holidays_sample PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_late_opens_sample PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_early_closes_sample PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_early_closes_sample_time PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_early_closes_weekdays PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_early_closes_weekdays_time PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_non_early_closes_sample PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_non_early_closes_sample_time PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_late_opens PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_early_closes PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_session_open_close_break_start_end PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_session_has_break PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_next_prev_session PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_session_offset PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_is_session PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_date_to_session PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_prev_next_open_close PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_sessions_in_range PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_sessions_has_break PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_sessions_window PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_sessions_distance PASSED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_trading_index FAILED [ 73%] tests/test_xosl_calendar.py::TestXOSLCalendar::test_deprecated PASSED [ 73%] tests/test_xpar_calendar.py::TestXPARCalendar::test_testbase_integrity PASSED [ 73%] tests/test_xpar_calendar.py::TestXPARCalendar::test_base_integrity PASSED [ 73%] tests/test_xpar_calendar.py::TestXPARCalendar::test_calculated_against_csv PASSED [ 73%] tests/test_xpar_calendar.py::TestXPARCalendar::test_start_end PASSED [ 73%] tests/test_xpar_calendar.py::TestXPARCalendar::test_invalid_input PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_bound_min PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_bound_max PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_sanity_check_session_lengths PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_adhoc_holidays_specification PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_daylight_savings PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_sessions PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_opens_closes_break_starts_ends PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minutes_properties[both] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minutes[both] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_calendar_bounds_properties[both] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_session_minute_methods[both] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_session_minutes[both] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_is_trading_minute[both] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_is_break_minute[both] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_is_open_on_minute[both] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_is_open_at_time[both] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_prev_next_minute[both] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_to_session[both-next] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_to_trading_minute[both-next] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_to_session[left-next] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_to_trading_minute[left-next] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minutes_properties[left] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minutes[left] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_calendar_bounds_properties[left] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_session_minute_methods[left] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_session_minutes[left] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_is_trading_minute[left] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_is_break_minute[left] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_is_open_on_minute[left] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_is_open_at_time[left] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_prev_next_minute[left] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_to_session[left-previous] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_to_session[both-previous] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_to_session[right-previous] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_to_session[right-next] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_to_trading_minute[right-next] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minutes_properties[right] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minutes[right] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_calendar_bounds_properties[right] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_session_minute_methods[right] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_session_minutes[right] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_is_trading_minute[right] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_is_break_minute[right] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_is_open_on_minute[right] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_is_open_at_time[right] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_prev_next_minute[right] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_to_session[right-none] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_to_trading_minute[right-none] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_to_session[left-none] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_to_trading_minute[left-none] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_to_session[both-none] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_to_trading_minute[both-none] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_to_session[neither-none] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_to_session[neither-previous] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_to_session[neither-next] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minutes_properties[neither] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minutes[neither] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_calendar_bounds_properties[neither] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_session_minute_methods[neither] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_session_minutes[neither] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_is_trading_minute[neither] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_is_break_minute[neither] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_is_open_on_minute[neither] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_is_open_at_time[neither] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_prev_next_minute[neither] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_to_past_session[neither] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_to_future_session[neither] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_offset[neither] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_offset_by_sessions[neither] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minutes_in_range[neither] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minutes_window[neither] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minutes_distance[neither] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minutes_to_sessions[neither] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_sessions_minutes[neither] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_sessions_minutes_count[neither] PASSED [ 74%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_to_past_session[right] PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_to_future_session[right] PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_offset[right] PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_offset_by_sessions[right] PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minutes_in_range[right] PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minutes_window[right] PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minutes_distance[right] PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minutes_to_sessions[right] PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_sessions_minutes[right] PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_sessions_minutes_count[right] PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_to_past_session[left] PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_to_future_session[left] PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_offset[left] PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_offset_by_sessions[left] PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minutes_in_range[left] PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minutes_window[left] PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minutes_distance[left] PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minutes_to_sessions[left] PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_sessions_minutes[left] PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_sessions_minutes_count[left] PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_to_past_session[both] PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_to_future_session[both] PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_offset[both] PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minute_offset_by_sessions[both] PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minutes_in_range[both] PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minutes_window[both] PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minutes_distance[both] PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_minutes_to_sessions[both] PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_sessions_minutes[both] PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_sessions_minutes_count[both] PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_has_break PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_regular_holidays_sample PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_adhoc_holidays_sample PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_non_holidays_sample PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_late_opens_sample PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_early_closes_sample PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_early_closes_sample_time PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_early_closes_weekdays PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_early_closes_weekdays_time PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_non_early_closes_sample PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_non_early_closes_sample_time PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_late_opens PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_early_closes PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_session_open_close_break_start_end PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_session_has_break PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_next_prev_session PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_session_offset PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_is_session PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_date_to_session PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_prev_next_open_close PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_sessions_in_range PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_sessions_has_break PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_sessions_window PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_sessions_distance PASSED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_trading_index FAILED [ 75%] tests/test_xpar_calendar.py::TestXPARCalendar::test_deprecated PASSED [ 75%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_testbase_integrity PASSED [ 75%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_base_integrity PASSED [ 75%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_calculated_against_csv PASSED [ 75%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_start_end PASSED [ 75%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_invalid_input PASSED [ 75%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_bound_min PASSED [ 75%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_bound_max PASSED [ 75%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_sanity_check_session_lengths PASSED [ 75%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_adhoc_holidays_specification PASSED [ 75%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_daylight_savings PASSED [ 75%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_sessions PASSED [ 75%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_opens_closes_break_starts_ends PASSED [ 75%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minutes_properties[both] PASSED [ 75%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minutes[both] PASSED [ 75%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_calendar_bounds_properties[both] PASSED [ 75%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_session_minute_methods[both] PASSED [ 75%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_session_minutes[both] PASSED [ 75%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_is_trading_minute[both] PASSED [ 75%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_is_break_minute[both] PASSED [ 75%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_is_open_on_minute[both] PASSED [ 75%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_is_open_at_time[both] PASSED [ 75%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_prev_next_minute[both] PASSED [ 75%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_to_session[both-next] PASSED [ 75%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_to_trading_minute[both-next] PASSED [ 75%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_to_session[left-next] PASSED [ 75%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_to_trading_minute[left-next] PASSED [ 75%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minutes_properties[left] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minutes[left] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_calendar_bounds_properties[left] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_session_minute_methods[left] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_session_minutes[left] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_is_trading_minute[left] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_is_break_minute[left] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_is_open_on_minute[left] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_is_open_at_time[left] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_prev_next_minute[left] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_to_session[left-previous] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_to_session[both-previous] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_to_session[right-previous] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_to_session[right-next] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_to_trading_minute[right-next] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minutes_properties[right] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minutes[right] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_calendar_bounds_properties[right] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_session_minute_methods[right] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_session_minutes[right] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_is_trading_minute[right] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_is_break_minute[right] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_is_open_on_minute[right] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_is_open_at_time[right] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_prev_next_minute[right] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_to_session[right-none] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_to_trading_minute[right-none] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_to_session[left-none] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_to_trading_minute[left-none] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_to_session[both-none] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_to_trading_minute[both-none] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_to_session[neither-none] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_to_session[neither-previous] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_to_session[neither-next] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minutes_properties[neither] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minutes[neither] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_calendar_bounds_properties[neither] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_session_minute_methods[neither] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_session_minutes[neither] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_is_trading_minute[neither] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_is_break_minute[neither] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_is_open_on_minute[neither] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_is_open_at_time[neither] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_prev_next_minute[neither] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_to_past_session[neither] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_to_future_session[neither] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_offset[neither] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_offset_by_sessions[neither] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minutes_in_range[neither] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minutes_window[neither] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minutes_distance[neither] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minutes_to_sessions[neither] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_sessions_minutes[neither] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_sessions_minutes_count[neither] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_to_past_session[right] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_to_future_session[right] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_offset[right] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_offset_by_sessions[right] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minutes_in_range[right] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minutes_window[right] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minutes_distance[right] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minutes_to_sessions[right] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_sessions_minutes[right] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_sessions_minutes_count[right] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_to_past_session[left] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_to_future_session[left] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_offset[left] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_offset_by_sessions[left] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minutes_in_range[left] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minutes_window[left] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minutes_distance[left] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minutes_to_sessions[left] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_sessions_minutes[left] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_sessions_minutes_count[left] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_to_past_session[both] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_to_future_session[both] PASSED [ 76%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_offset[both] PASSED [ 77%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minute_offset_by_sessions[both] PASSED [ 77%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minutes_in_range[both] PASSED [ 77%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minutes_window[both] PASSED [ 77%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minutes_distance[both] PASSED [ 77%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_minutes_to_sessions[both] PASSED [ 77%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_sessions_minutes[both] PASSED [ 77%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_sessions_minutes_count[both] PASSED [ 77%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_has_break PASSED [ 77%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_regular_holidays_sample PASSED [ 77%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_adhoc_holidays_sample PASSED [ 77%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_non_holidays_sample PASSED [ 77%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_late_opens_sample PASSED [ 77%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_early_closes_sample PASSED [ 77%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_early_closes_sample_time PASSED [ 77%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_early_closes_weekdays PASSED [ 77%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_early_closes_weekdays_time PASSED [ 77%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_non_early_closes_sample PASSED [ 77%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_non_early_closes_sample_time PASSED [ 77%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_late_opens PASSED [ 77%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_early_closes PASSED [ 77%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_session_open_close_break_start_end PASSED [ 77%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_session_has_break PASSED [ 77%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_next_prev_session PASSED [ 77%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_session_offset PASSED [ 77%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_is_session PASSED [ 77%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_date_to_session PASSED [ 77%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_prev_next_open_close PASSED [ 77%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_sessions_in_range PASSED [ 77%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_sessions_has_break PASSED [ 77%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_sessions_window PASSED [ 77%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_sessions_distance PASSED [ 77%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_trading_index FAILED [ 77%] tests/test_xphs_calendar.py::TestXPHSCalendar::test_deprecated PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_testbase_integrity PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_base_integrity PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_calculated_against_csv PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_start_end PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_invalid_input PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_bound_min PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_bound_max PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_sanity_check_session_lengths PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_adhoc_holidays_specification PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_daylight_savings PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_sessions PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_opens_closes_break_starts_ends PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minutes_properties[both] PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minutes[both] PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_calendar_bounds_properties[both] PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_session_minute_methods[both] PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_session_minutes[both] PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_is_trading_minute[both] PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_is_break_minute[both] PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_is_open_on_minute[both] PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_is_open_at_time[both] PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_prev_next_minute[both] PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_to_session[both-next] PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_to_trading_minute[both-next] PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_to_session[left-next] PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_to_trading_minute[left-next] PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minutes_properties[left] PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minutes[left] PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_calendar_bounds_properties[left] PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_session_minute_methods[left] PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_session_minutes[left] PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_is_trading_minute[left] PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_is_break_minute[left] PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_is_open_on_minute[left] PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_is_open_at_time[left] PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_prev_next_minute[left] PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_to_session[left-previous] PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_to_trading_minute[left-previous] PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_to_session[both-previous] PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_to_trading_minute[both-previous] PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_to_session[right-previous] PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_to_trading_minute[right-previous] PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_to_session[right-next] PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_to_trading_minute[right-next] PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minutes_properties[right] PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minutes[right] PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_calendar_bounds_properties[right] PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_session_minute_methods[right] PASSED [ 77%] tests/test_xpra_calendar.py::TestXPRACalendar::test_session_minutes[right] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_is_trading_minute[right] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_is_break_minute[right] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_is_open_on_minute[right] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_is_open_at_time[right] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_prev_next_minute[right] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_to_session[right-none] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_to_trading_minute[right-none] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_to_session[left-none] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_to_trading_minute[left-none] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_to_session[both-none] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_to_trading_minute[both-none] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_to_session[neither-none] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_to_trading_minute[neither-none] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_to_session[neither-previous] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_to_session[neither-next] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_to_trading_minute[neither-next] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minutes_properties[neither] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minutes[neither] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_calendar_bounds_properties[neither] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_session_minute_methods[neither] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_session_minutes[neither] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_is_trading_minute[neither] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_is_break_minute[neither] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_is_open_on_minute[neither] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_is_open_at_time[neither] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_prev_next_minute[neither] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_to_past_session[neither] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_to_future_session[neither] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_offset[neither] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_offset_by_sessions[neither] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minutes_in_range[neither] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minutes_window[neither] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minutes_distance[neither] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minutes_to_sessions[neither] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_sessions_minutes[neither] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_sessions_minutes_count[neither] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_to_past_session[right] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_to_future_session[right] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_offset[right] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_offset_by_sessions[right] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minutes_in_range[right] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minutes_window[right] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minutes_distance[right] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minutes_to_sessions[right] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_sessions_minutes[right] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_sessions_minutes_count[right] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_to_past_session[left] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_to_future_session[left] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_offset[left] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_offset_by_sessions[left] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minutes_in_range[left] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minutes_window[left] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minutes_distance[left] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minutes_to_sessions[left] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_sessions_minutes[left] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_sessions_minutes_count[left] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_to_past_session[both] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_to_future_session[both] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_offset[both] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minute_offset_by_sessions[both] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minutes_in_range[both] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minutes_window[both] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minutes_distance[both] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_minutes_to_sessions[both] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_sessions_minutes[both] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_sessions_minutes_count[both] PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_has_break PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_regular_holidays_sample PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_adhoc_holidays_sample PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_non_holidays_sample PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_late_opens_sample PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_early_closes_sample PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_early_closes_sample_time PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_early_closes_weekdays PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_early_closes_weekdays_time PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_non_early_closes_sample PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_non_early_closes_sample_time PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_late_opens PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_early_closes PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_session_open_close_break_start_end PASSED [ 78%] tests/test_xpra_calendar.py::TestXPRACalendar::test_session_has_break PASSED [ 79%] tests/test_xpra_calendar.py::TestXPRACalendar::test_next_prev_session PASSED [ 79%] tests/test_xpra_calendar.py::TestXPRACalendar::test_session_offset PASSED [ 79%] tests/test_xpra_calendar.py::TestXPRACalendar::test_is_session PASSED [ 79%] tests/test_xpra_calendar.py::TestXPRACalendar::test_date_to_session PASSED [ 79%] tests/test_xpra_calendar.py::TestXPRACalendar::test_prev_next_open_close PASSED [ 79%] tests/test_xpra_calendar.py::TestXPRACalendar::test_sessions_in_range PASSED [ 79%] tests/test_xpra_calendar.py::TestXPRACalendar::test_sessions_has_break PASSED [ 79%] tests/test_xpra_calendar.py::TestXPRACalendar::test_sessions_window PASSED [ 79%] tests/test_xpra_calendar.py::TestXPRACalendar::test_sessions_distance PASSED [ 79%] tests/test_xpra_calendar.py::TestXPRACalendar::test_trading_index FAILED [ 79%] tests/test_xpra_calendar.py::TestXPRACalendar::test_deprecated PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_testbase_integrity PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_base_integrity PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_calculated_against_csv PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_start_end PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_invalid_input PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_bound_min PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_bound_max PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_sanity_check_session_lengths PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_adhoc_holidays_specification PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_daylight_savings PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_sessions PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_opens_closes_break_starts_ends PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minutes_properties[both] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minutes[both] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_calendar_bounds_properties[both] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_session_minute_methods[both] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_session_minutes[both] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_is_trading_minute[both] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_is_break_minute[both] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_is_open_on_minute[both] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_is_open_at_time[both] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_prev_next_minute[both] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_to_session[both-next] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_to_trading_minute[both-next] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_to_session[left-next] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_to_trading_minute[left-next] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minutes_properties[left] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minutes[left] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_calendar_bounds_properties[left] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_session_minute_methods[left] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_session_minutes[left] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_is_trading_minute[left] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_is_break_minute[left] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_is_open_on_minute[left] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_is_open_at_time[left] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_prev_next_minute[left] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_to_session[left-previous] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_to_session[both-previous] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_to_session[right-previous] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_to_session[right-next] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_to_trading_minute[right-next] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minutes_properties[right] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minutes[right] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_calendar_bounds_properties[right] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_session_minute_methods[right] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_session_minutes[right] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_is_trading_minute[right] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_is_break_minute[right] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_is_open_on_minute[right] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_is_open_at_time[right] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_prev_next_minute[right] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_to_session[right-none] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_to_trading_minute[right-none] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_to_session[left-none] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_to_trading_minute[left-none] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_to_session[both-none] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_to_trading_minute[both-none] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_to_session[neither-none] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_to_session[neither-previous] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_to_session[neither-next] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minutes_properties[neither] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minutes[neither] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_calendar_bounds_properties[neither] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_session_minute_methods[neither] PASSED [ 79%] tests/test_xsau_calendar.py::TestXASUCalendar::test_session_minutes[neither] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_is_trading_minute[neither] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_is_break_minute[neither] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_is_open_on_minute[neither] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_is_open_at_time[neither] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_prev_next_minute[neither] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_to_past_session[neither] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_to_future_session[neither] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_offset[neither] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_offset_by_sessions[neither] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minutes_in_range[neither] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minutes_window[neither] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minutes_distance[neither] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minutes_to_sessions[neither] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_sessions_minutes[neither] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_sessions_minutes_count[neither] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_to_past_session[right] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_to_future_session[right] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_offset[right] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_offset_by_sessions[right] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minutes_in_range[right] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minutes_window[right] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minutes_distance[right] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minutes_to_sessions[right] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_sessions_minutes[right] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_sessions_minutes_count[right] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_to_past_session[left] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_to_future_session[left] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_offset[left] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_offset_by_sessions[left] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minutes_in_range[left] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minutes_window[left] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minutes_distance[left] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minutes_to_sessions[left] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_sessions_minutes[left] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_sessions_minutes_count[left] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_to_past_session[both] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_to_future_session[both] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_offset[both] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minute_offset_by_sessions[both] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minutes_in_range[both] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minutes_window[both] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minutes_distance[both] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_minutes_to_sessions[both] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_sessions_minutes[both] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_sessions_minutes_count[both] PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_has_break PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_regular_holidays_sample PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_adhoc_holidays_sample PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_non_holidays_sample PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_late_opens_sample PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_early_closes_sample PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_early_closes_sample_time PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_early_closes_weekdays PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_early_closes_weekdays_time PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_non_early_closes_sample PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_non_early_closes_sample_time PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_late_opens PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_early_closes PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_session_open_close_break_start_end PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_session_has_break PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_next_prev_session PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_session_offset PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_is_session PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_date_to_session PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_prev_next_open_close PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_sessions_in_range PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_sessions_has_break PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_sessions_window PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_sessions_distance PASSED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_trading_index FAILED [ 80%] tests/test_xsau_calendar.py::TestXASUCalendar::test_deprecated PASSED [ 80%] tests/test_xses_calendar.py::TestXSESCalendar::test_testbase_integrity PASSED [ 80%] tests/test_xses_calendar.py::TestXSESCalendar::test_base_integrity PASSED [ 80%] tests/test_xses_calendar.py::TestXSESCalendar::test_calculated_against_csv PASSED [ 80%] tests/test_xses_calendar.py::TestXSESCalendar::test_start_end PASSED [ 80%] tests/test_xses_calendar.py::TestXSESCalendar::test_invalid_input PASSED [ 80%] tests/test_xses_calendar.py::TestXSESCalendar::test_bound_min PASSED [ 80%] tests/test_xses_calendar.py::TestXSESCalendar::test_bound_max PASSED [ 80%] tests/test_xses_calendar.py::TestXSESCalendar::test_sanity_check_session_lengths PASSED [ 80%] tests/test_xses_calendar.py::TestXSESCalendar::test_adhoc_holidays_specification PASSED [ 80%] tests/test_xses_calendar.py::TestXSESCalendar::test_daylight_savings PASSED [ 80%] tests/test_xses_calendar.py::TestXSESCalendar::test_sessions PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_opens_closes_break_starts_ends PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minutes_properties[both] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minutes[both] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_calendar_bounds_properties[both] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_session_minute_methods[both] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_session_minutes[both] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_is_trading_minute[both] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_is_break_minute[both] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_is_open_on_minute[both] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_is_open_at_time[both] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_prev_next_minute[both] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_to_session[both-next] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_to_trading_minute[both-next] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_to_session[left-next] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_to_trading_minute[left-next] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minutes_properties[left] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minutes[left] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_calendar_bounds_properties[left] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_session_minute_methods[left] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_session_minutes[left] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_is_trading_minute[left] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_is_break_minute[left] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_is_open_on_minute[left] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_is_open_at_time[left] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_prev_next_minute[left] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_to_session[left-previous] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_to_session[both-previous] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_to_session[right-previous] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_to_session[right-next] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_to_trading_minute[right-next] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minutes_properties[right] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minutes[right] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_calendar_bounds_properties[right] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_session_minute_methods[right] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_session_minutes[right] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_is_trading_minute[right] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_is_break_minute[right] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_is_open_on_minute[right] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_is_open_at_time[right] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_prev_next_minute[right] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_to_session[right-none] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_to_trading_minute[right-none] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_to_session[left-none] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_to_trading_minute[left-none] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_to_session[both-none] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_to_trading_minute[both-none] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_to_session[neither-none] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_to_session[neither-previous] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_to_session[neither-next] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minutes_properties[neither] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minutes[neither] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_calendar_bounds_properties[neither] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_session_minute_methods[neither] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_session_minutes[neither] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_is_trading_minute[neither] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_is_break_minute[neither] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_is_open_on_minute[neither] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_is_open_at_time[neither] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_prev_next_minute[neither] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_to_past_session[neither] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_to_future_session[neither] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_offset[neither] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_offset_by_sessions[neither] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minutes_in_range[neither] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minutes_window[neither] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minutes_distance[neither] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minutes_to_sessions[neither] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_sessions_minutes[neither] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_sessions_minutes_count[neither] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_to_past_session[right] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_to_future_session[right] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_offset[right] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_offset_by_sessions[right] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minutes_in_range[right] PASSED [ 81%] tests/test_xses_calendar.py::TestXSESCalendar::test_minutes_window[right] PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_minutes_distance[right] PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_minutes_to_sessions[right] PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_sessions_minutes[right] PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_sessions_minutes_count[right] PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_to_past_session[left] PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_to_future_session[left] PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_offset[left] PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_offset_by_sessions[left] PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_minutes_in_range[left] PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_minutes_window[left] PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_minutes_distance[left] PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_minutes_to_sessions[left] PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_sessions_minutes[left] PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_sessions_minutes_count[left] PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_to_past_session[both] PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_to_future_session[both] PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_offset[both] PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_minute_offset_by_sessions[both] PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_minutes_in_range[both] PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_minutes_window[both] PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_minutes_distance[both] PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_minutes_to_sessions[both] PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_sessions_minutes[both] PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_sessions_minutes_count[both] PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_has_break PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_regular_holidays_sample PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_adhoc_holidays_sample PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_non_holidays_sample PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_late_opens_sample PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_early_closes_sample PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_early_closes_sample_time PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_early_closes_weekdays PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_early_closes_weekdays_time PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_non_early_closes_sample PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_non_early_closes_sample_time PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_late_opens PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_early_closes PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_session_open_close_break_start_end PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_session_has_break PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_next_prev_session PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_session_offset PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_is_session PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_date_to_session PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_prev_next_open_close PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_sessions_in_range PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_sessions_has_break PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_sessions_window PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_sessions_distance PASSED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_trading_index FAILED [ 82%] tests/test_xses_calendar.py::TestXSESCalendar::test_deprecated PASSED [ 82%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_testbase_integrity PASSED [ 82%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_base_integrity PASSED [ 82%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_calculated_against_csv PASSED [ 82%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_start_end PASSED [ 82%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_invalid_input PASSED [ 82%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_bound_min PASSED [ 82%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_bound_max PASSED [ 82%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_sanity_check_session_lengths PASSED [ 82%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_adhoc_holidays_specification PASSED [ 82%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_daylight_savings PASSED [ 82%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_sessions PASSED [ 82%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_opens_closes_break_starts_ends PASSED [ 82%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minutes_properties[both] PASSED [ 82%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minutes[both] PASSED [ 82%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_calendar_bounds_properties[both] PASSED [ 82%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_session_minute_methods[both] PASSED [ 82%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_session_minutes[both] PASSED [ 82%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_is_trading_minute[both] PASSED [ 82%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_is_break_minute[both] PASSED [ 82%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_is_open_on_minute[both] PASSED [ 82%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_is_open_at_time[both] PASSED [ 82%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_prev_next_minute[both] PASSED [ 82%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_to_session[both-next] PASSED [ 82%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_to_trading_minute[both-next] PASSED [ 82%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_to_session[left-next] PASSED [ 82%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_to_trading_minute[left-next] PASSED [ 82%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minutes_properties[left] PASSED [ 82%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minutes[left] PASSED [ 82%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_calendar_bounds_properties[left] PASSED [ 82%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_session_minute_methods[left] PASSED [ 82%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_session_minutes[left] PASSED [ 82%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_is_trading_minute[left] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_is_break_minute[left] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_is_open_on_minute[left] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_is_open_at_time[left] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_prev_next_minute[left] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_to_session[left-previous] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_to_session[both-previous] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_to_session[right-previous] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_to_session[right-next] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_to_trading_minute[right-next] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minutes_properties[right] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minutes[right] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_calendar_bounds_properties[right] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_session_minute_methods[right] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_session_minutes[right] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_is_trading_minute[right] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_is_break_minute[right] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_is_open_on_minute[right] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_is_open_at_time[right] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_prev_next_minute[right] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_to_session[right-none] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_to_trading_minute[right-none] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_to_session[left-none] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_to_trading_minute[left-none] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_to_session[both-none] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_to_trading_minute[both-none] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_to_session[neither-none] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_to_session[neither-previous] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_to_session[neither-next] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minutes_properties[neither] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minutes[neither] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_calendar_bounds_properties[neither] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_session_minute_methods[neither] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_session_minutes[neither] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_is_trading_minute[neither] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_is_break_minute[neither] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_is_open_on_minute[neither] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_is_open_at_time[neither] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_prev_next_minute[neither] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_to_past_session[neither] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_to_future_session[neither] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_offset[neither] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_offset_by_sessions[neither] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minutes_in_range[neither] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minutes_window[neither] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minutes_distance[neither] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minutes_to_sessions[neither] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_sessions_minutes[neither] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_sessions_minutes_count[neither] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_to_past_session[right] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_to_future_session[right] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_offset[right] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_offset_by_sessions[right] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minutes_in_range[right] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minutes_window[right] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minutes_distance[right] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minutes_to_sessions[right] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_sessions_minutes[right] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_sessions_minutes_count[right] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_to_past_session[left] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_to_future_session[left] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_offset[left] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_offset_by_sessions[left] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minutes_in_range[left] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minutes_window[left] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minutes_distance[left] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minutes_to_sessions[left] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_sessions_minutes[left] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_sessions_minutes_count[left] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_to_past_session[both] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_to_future_session[both] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_offset[both] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minute_offset_by_sessions[both] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minutes_in_range[both] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minutes_window[both] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minutes_distance[both] PASSED [ 83%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_minutes_to_sessions[both] PASSED [ 84%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_sessions_minutes[both] PASSED [ 84%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_sessions_minutes_count[both] PASSED [ 84%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_has_break PASSED [ 84%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_regular_holidays_sample PASSED [ 84%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_adhoc_holidays_sample PASSED [ 84%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_non_holidays_sample PASSED [ 84%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_late_opens_sample PASSED [ 84%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_early_closes_sample PASSED [ 84%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_early_closes_sample_time PASSED [ 84%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_early_closes_weekdays PASSED [ 84%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_early_closes_weekdays_time PASSED [ 84%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_non_early_closes_sample PASSED [ 84%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_non_early_closes_sample_time PASSED [ 84%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_late_opens PASSED [ 84%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_early_closes PASSED [ 84%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_session_open_close_break_start_end PASSED [ 84%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_session_has_break PASSED [ 84%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_next_prev_session PASSED [ 84%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_session_offset PASSED [ 84%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_is_session PASSED [ 84%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_date_to_session PASSED [ 84%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_prev_next_open_close PASSED [ 84%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_sessions_in_range PASSED [ 84%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_sessions_has_break PASSED [ 84%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_sessions_window PASSED [ 84%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_sessions_distance PASSED [ 84%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_trading_index FAILED [ 84%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_deprecated PASSED [ 84%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_additional_early_closes_sample PASSED [ 84%] tests/test_xsgo_calendar.py::TestXSGOCalendar::test_close_time_change PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_testbase_integrity PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_base_integrity PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_calculated_against_csv PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_start_end PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_invalid_input PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_bound_min PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_bound_max PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_sanity_check_session_lengths PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_adhoc_holidays_specification PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_daylight_savings PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_sessions PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_opens_closes_break_starts_ends PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minutes_properties[both] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minutes[both] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_calendar_bounds_properties[both] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_session_minute_methods[both] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_session_minutes[both] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_is_trading_minute[both] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_is_break_minute[both] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_is_open_on_minute[both] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_is_open_at_time[both] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_prev_next_minute[both] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_to_session[both-next] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_to_trading_minute[both-next] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_to_session[left-next] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_to_trading_minute[left-next] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minutes_properties[left] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minutes[left] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_calendar_bounds_properties[left] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_session_minute_methods[left] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_session_minutes[left] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_is_trading_minute[left] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_is_break_minute[left] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_is_open_on_minute[left] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_is_open_at_time[left] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_prev_next_minute[left] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_to_session[left-previous] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_to_session[both-previous] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_to_session[right-previous] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_to_session[right-next] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_to_trading_minute[right-next] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minutes_properties[right] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minutes[right] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_calendar_bounds_properties[right] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_session_minute_methods[right] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_session_minutes[right] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_is_trading_minute[right] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_is_break_minute[right] PASSED [ 84%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_is_open_on_minute[right] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_is_open_at_time[right] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_prev_next_minute[right] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_to_session[right-none] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_to_trading_minute[right-none] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_to_session[left-none] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_to_trading_minute[left-none] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_to_session[both-none] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_to_trading_minute[both-none] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_to_session[neither-none] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_to_session[neither-previous] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_to_session[neither-next] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minutes_properties[neither] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minutes[neither] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_calendar_bounds_properties[neither] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_session_minute_methods[neither] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_session_minutes[neither] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_is_trading_minute[neither] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_is_break_minute[neither] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_is_open_on_minute[neither] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_is_open_at_time[neither] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_prev_next_minute[neither] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_to_past_session[neither] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_to_future_session[neither] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_offset[neither] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_offset_by_sessions[neither] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minutes_in_range[neither] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minutes_window[neither] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minutes_distance[neither] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minutes_to_sessions[neither] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_sessions_minutes[neither] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_sessions_minutes_count[neither] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_to_past_session[right] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_to_future_session[right] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_offset[right] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_offset_by_sessions[right] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minutes_in_range[right] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minutes_window[right] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minutes_distance[right] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minutes_to_sessions[right] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_sessions_minutes[right] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_sessions_minutes_count[right] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_to_past_session[left] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_to_future_session[left] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_offset[left] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_offset_by_sessions[left] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minutes_in_range[left] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minutes_window[left] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minutes_distance[left] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minutes_to_sessions[left] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_sessions_minutes[left] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_sessions_minutes_count[left] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_to_past_session[both] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_to_future_session[both] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_offset[both] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minute_offset_by_sessions[both] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minutes_in_range[both] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minutes_window[both] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minutes_distance[both] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_minutes_to_sessions[both] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_sessions_minutes[both] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_sessions_minutes_count[both] PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_has_break PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_regular_holidays_sample PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_adhoc_holidays_sample PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_non_holidays_sample PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_late_opens_sample PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_early_closes_sample PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_early_closes_sample_time PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_early_closes_weekdays PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_early_closes_weekdays_time PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_non_early_closes_sample PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_non_early_closes_sample_time PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_late_opens PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_early_closes PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_session_open_close_break_start_end PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_session_has_break PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_next_prev_session PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_session_offset PASSED [ 85%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_is_session PASSED [ 86%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_date_to_session PASSED [ 86%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_prev_next_open_close PASSED [ 86%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_sessions_in_range PASSED [ 86%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_sessions_has_break PASSED [ 86%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_sessions_window PASSED [ 86%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_sessions_distance PASSED [ 86%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_trading_index FAILED [ 86%] tests/test_xshg_calendar.py::TestXSHGCalendar::test_deprecated PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_testbase_integrity PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_base_integrity PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_calculated_against_csv PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_start_end PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_invalid_input PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_bound_min PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_bound_max PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_sanity_check_session_lengths PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_adhoc_holidays_specification PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_daylight_savings PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_sessions PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_opens_closes_break_starts_ends PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minutes_properties[both] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minutes[both] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_calendar_bounds_properties[both] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_session_minute_methods[both] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_session_minutes[both] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_is_trading_minute[both] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_is_break_minute[both] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_is_open_on_minute[both] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_is_open_at_time[both] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_prev_next_minute[both] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_to_session[both-next] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_to_trading_minute[both-next] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_to_session[left-next] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_to_trading_minute[left-next] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minutes_properties[left] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minutes[left] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_calendar_bounds_properties[left] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_session_minute_methods[left] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_session_minutes[left] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_is_trading_minute[left] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_is_break_minute[left] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_is_open_on_minute[left] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_is_open_at_time[left] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_prev_next_minute[left] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_to_session[left-previous] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_to_session[both-previous] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_to_session[right-previous] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_to_session[right-next] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_to_trading_minute[right-next] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minutes_properties[right] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minutes[right] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_calendar_bounds_properties[right] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_session_minute_methods[right] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_session_minutes[right] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_is_trading_minute[right] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_is_break_minute[right] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_is_open_on_minute[right] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_is_open_at_time[right] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_prev_next_minute[right] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_to_session[right-none] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_to_trading_minute[right-none] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_to_session[left-none] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_to_trading_minute[left-none] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_to_session[both-none] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_to_trading_minute[both-none] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_to_session[neither-none] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_to_session[neither-previous] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_to_session[neither-next] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minutes_properties[neither] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minutes[neither] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_calendar_bounds_properties[neither] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_session_minute_methods[neither] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_session_minutes[neither] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_is_trading_minute[neither] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_is_break_minute[neither] PASSED [ 86%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_is_open_on_minute[neither] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_is_open_at_time[neither] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_prev_next_minute[neither] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_to_past_session[neither] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_to_future_session[neither] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_offset[neither] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_offset_by_sessions[neither] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minutes_in_range[neither] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minutes_window[neither] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minutes_distance[neither] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minutes_to_sessions[neither] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_sessions_minutes[neither] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_sessions_minutes_count[neither] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_to_past_session[right] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_to_future_session[right] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_offset[right] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_offset_by_sessions[right] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minutes_in_range[right] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minutes_window[right] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minutes_distance[right] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minutes_to_sessions[right] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_sessions_minutes[right] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_sessions_minutes_count[right] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_to_past_session[left] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_to_future_session[left] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_offset[left] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_offset_by_sessions[left] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minutes_in_range[left] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minutes_window[left] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minutes_distance[left] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minutes_to_sessions[left] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_sessions_minutes[left] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_sessions_minutes_count[left] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_to_past_session[both] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_to_future_session[both] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_offset[both] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minute_offset_by_sessions[both] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minutes_in_range[both] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minutes_window[both] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minutes_distance[both] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_minutes_to_sessions[both] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_sessions_minutes[both] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_sessions_minutes_count[both] PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_has_break PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_regular_holidays_sample PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_adhoc_holidays_sample PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_non_holidays_sample PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_late_opens_sample PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_early_closes_sample PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_early_closes_sample_time PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_early_closes_weekdays PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_early_closes_weekdays_time PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_non_early_closes_sample PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_non_early_closes_sample_time PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_late_opens PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_early_closes PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_session_open_close_break_start_end PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_session_has_break PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_next_prev_session PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_session_offset PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_is_session PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_date_to_session PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_prev_next_open_close PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_sessions_in_range PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_sessions_has_break PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_sessions_window PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_sessions_distance PASSED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_trading_index FAILED [ 87%] tests/test_xsto_calendar.py::TestXSTOCalendar::test_deprecated PASSED [ 87%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_testbase_integrity PASSED [ 87%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_base_integrity PASSED [ 87%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_calculated_against_csv PASSED [ 87%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_start_end PASSED [ 87%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_invalid_input PASSED [ 87%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_bound_min PASSED [ 87%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_bound_max PASSED [ 87%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_sanity_check_session_lengths PASSED [ 87%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_adhoc_holidays_specification PASSED [ 87%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_daylight_savings PASSED [ 87%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_sessions PASSED [ 87%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_opens_closes_break_starts_ends PASSED [ 87%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minutes_properties[both] PASSED [ 87%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minutes[both] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_calendar_bounds_properties[both] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_session_minute_methods[both] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_session_minutes[both] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_is_trading_minute[both] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_is_break_minute[both] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_is_open_on_minute[both] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_is_open_at_time[both] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_prev_next_minute[both] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_to_session[both-next] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_to_trading_minute[both-next] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_to_session[left-next] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_to_trading_minute[left-next] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minutes_properties[left] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minutes[left] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_calendar_bounds_properties[left] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_session_minute_methods[left] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_session_minutes[left] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_is_trading_minute[left] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_is_break_minute[left] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_is_open_on_minute[left] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_is_open_at_time[left] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_prev_next_minute[left] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_to_session[left-previous] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_to_session[both-previous] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_to_session[right-previous] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_to_session[right-next] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_to_trading_minute[right-next] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minutes_properties[right] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minutes[right] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_calendar_bounds_properties[right] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_session_minute_methods[right] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_session_minutes[right] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_is_trading_minute[right] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_is_break_minute[right] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_is_open_on_minute[right] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_is_open_at_time[right] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_prev_next_minute[right] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_to_session[right-none] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_to_trading_minute[right-none] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_to_session[left-none] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_to_trading_minute[left-none] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_to_session[both-none] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_to_trading_minute[both-none] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_to_session[neither-none] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_to_session[neither-previous] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_to_session[neither-next] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minutes_properties[neither] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minutes[neither] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_calendar_bounds_properties[neither] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_session_minute_methods[neither] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_session_minutes[neither] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_is_trading_minute[neither] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_is_break_minute[neither] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_is_open_on_minute[neither] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_is_open_at_time[neither] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_prev_next_minute[neither] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_to_past_session[neither] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_to_future_session[neither] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_offset[neither] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_offset_by_sessions[neither] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minutes_in_range[neither] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minutes_window[neither] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minutes_distance[neither] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minutes_to_sessions[neither] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_sessions_minutes[neither] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_sessions_minutes_count[neither] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_to_past_session[right] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_to_future_session[right] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_offset[right] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_offset_by_sessions[right] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minutes_in_range[right] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minutes_window[right] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minutes_distance[right] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minutes_to_sessions[right] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_sessions_minutes[right] PASSED [ 88%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_sessions_minutes_count[right] PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_to_past_session[left] PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_to_future_session[left] PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_offset[left] PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_offset_by_sessions[left] PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minutes_in_range[left] PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minutes_window[left] PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minutes_distance[left] PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minutes_to_sessions[left] PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_sessions_minutes[left] PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_sessions_minutes_count[left] PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_to_past_session[both] PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_to_future_session[both] PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_offset[both] PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minute_offset_by_sessions[both] PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minutes_in_range[both] PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minutes_window[both] PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minutes_distance[both] PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_minutes_to_sessions[both] PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_sessions_minutes[both] PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_sessions_minutes_count[both] PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_has_break PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_regular_holidays_sample PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_adhoc_holidays_sample PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_non_holidays_sample PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_late_opens_sample PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_early_closes_sample PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_early_closes_sample_time PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_early_closes_weekdays PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_early_closes_weekdays_time PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_non_early_closes_sample PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_non_early_closes_sample_time PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_late_opens PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_early_closes PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_session_open_close_break_start_end PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_session_has_break PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_next_prev_session PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_session_offset PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_is_session PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_date_to_session PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_prev_next_open_close PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_sessions_in_range PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_sessions_has_break PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_sessions_window PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_sessions_distance PASSED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_trading_index FAILED [ 89%] tests/test_xswx_calendar.py::TestIXSWXCalendar::test_deprecated PASSED [ 89%] tests/test_xtae_calendar.py::TestXTAECalendar::test_testbase_integrity PASSED [ 89%] tests/test_xtae_calendar.py::TestXTAECalendar::test_base_integrity PASSED [ 89%] tests/test_xtae_calendar.py::TestXTAECalendar::test_calculated_against_csv PASSED [ 89%] tests/test_xtae_calendar.py::TestXTAECalendar::test_start_end PASSED [ 89%] tests/test_xtae_calendar.py::TestXTAECalendar::test_invalid_input PASSED [ 89%] tests/test_xtae_calendar.py::TestXTAECalendar::test_bound_min PASSED [ 89%] tests/test_xtae_calendar.py::TestXTAECalendar::test_bound_max PASSED [ 89%] tests/test_xtae_calendar.py::TestXTAECalendar::test_sanity_check_session_lengths PASSED [ 89%] tests/test_xtae_calendar.py::TestXTAECalendar::test_adhoc_holidays_specification PASSED [ 89%] tests/test_xtae_calendar.py::TestXTAECalendar::test_daylight_savings PASSED [ 89%] tests/test_xtae_calendar.py::TestXTAECalendar::test_sessions PASSED [ 89%] tests/test_xtae_calendar.py::TestXTAECalendar::test_opens_closes_break_starts_ends PASSED [ 89%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minutes_properties[both] PASSED [ 89%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minutes[both] PASSED [ 89%] tests/test_xtae_calendar.py::TestXTAECalendar::test_calendar_bounds_properties[both] PASSED [ 89%] tests/test_xtae_calendar.py::TestXTAECalendar::test_session_minute_methods[both] PASSED [ 89%] tests/test_xtae_calendar.py::TestXTAECalendar::test_session_minutes[both] PASSED [ 89%] tests/test_xtae_calendar.py::TestXTAECalendar::test_is_trading_minute[both] PASSED [ 89%] tests/test_xtae_calendar.py::TestXTAECalendar::test_is_break_minute[both] PASSED [ 89%] tests/test_xtae_calendar.py::TestXTAECalendar::test_is_open_on_minute[both] PASSED [ 89%] tests/test_xtae_calendar.py::TestXTAECalendar::test_is_open_at_time[both] PASSED [ 89%] tests/test_xtae_calendar.py::TestXTAECalendar::test_prev_next_minute[both] PASSED [ 89%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_to_session[both-next] PASSED [ 89%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_to_trading_minute[both-next] PASSED [ 89%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_to_session[left-next] PASSED [ 89%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_to_trading_minute[left-next] PASSED [ 89%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minutes_properties[left] PASSED [ 89%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minutes[left] PASSED [ 89%] tests/test_xtae_calendar.py::TestXTAECalendar::test_calendar_bounds_properties[left] PASSED [ 89%] tests/test_xtae_calendar.py::TestXTAECalendar::test_session_minute_methods[left] PASSED [ 89%] tests/test_xtae_calendar.py::TestXTAECalendar::test_session_minutes[left] PASSED [ 89%] tests/test_xtae_calendar.py::TestXTAECalendar::test_is_trading_minute[left] PASSED [ 89%] tests/test_xtae_calendar.py::TestXTAECalendar::test_is_break_minute[left] PASSED [ 89%] tests/test_xtae_calendar.py::TestXTAECalendar::test_is_open_on_minute[left] PASSED [ 89%] tests/test_xtae_calendar.py::TestXTAECalendar::test_is_open_at_time[left] PASSED [ 89%] tests/test_xtae_calendar.py::TestXTAECalendar::test_prev_next_minute[left] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_to_session[left-previous] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_to_trading_minute[left-previous] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_to_session[both-previous] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_to_trading_minute[both-previous] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_to_session[right-previous] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_to_trading_minute[right-previous] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_to_session[right-next] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_to_trading_minute[right-next] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minutes_properties[right] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minutes[right] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_calendar_bounds_properties[right] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_session_minute_methods[right] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_session_minutes[right] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_is_trading_minute[right] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_is_break_minute[right] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_is_open_on_minute[right] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_is_open_at_time[right] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_prev_next_minute[right] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_to_session[right-none] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_to_trading_minute[right-none] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_to_session[left-none] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_to_trading_minute[left-none] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_to_session[both-none] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_to_trading_minute[both-none] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_to_session[neither-none] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_to_trading_minute[neither-none] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_to_session[neither-previous] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_to_session[neither-next] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_to_trading_minute[neither-next] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minutes_properties[neither] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minutes[neither] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_calendar_bounds_properties[neither] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_session_minute_methods[neither] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_session_minutes[neither] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_is_trading_minute[neither] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_is_break_minute[neither] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_is_open_on_minute[neither] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_is_open_at_time[neither] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_prev_next_minute[neither] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_to_past_session[neither] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_to_future_session[neither] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_offset[neither] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_offset_by_sessions[neither] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minutes_in_range[neither] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minutes_window[neither] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minutes_distance[neither] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minutes_to_sessions[neither] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_sessions_minutes[neither] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_sessions_minutes_count[neither] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_to_past_session[right] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_to_future_session[right] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_offset[right] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_offset_by_sessions[right] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minutes_in_range[right] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minutes_window[right] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minutes_distance[right] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minutes_to_sessions[right] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_sessions_minutes[right] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_sessions_minutes_count[right] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_to_past_session[left] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_to_future_session[left] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_offset[left] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_offset_by_sessions[left] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minutes_in_range[left] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minutes_window[left] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minutes_distance[left] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minutes_to_sessions[left] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_sessions_minutes[left] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_sessions_minutes_count[left] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_to_past_session[both] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_to_future_session[both] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_offset[both] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minute_offset_by_sessions[both] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minutes_in_range[both] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minutes_window[both] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minutes_distance[both] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_minutes_to_sessions[both] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_sessions_minutes[both] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_sessions_minutes_count[both] PASSED [ 90%] tests/test_xtae_calendar.py::TestXTAECalendar::test_has_break PASSED [ 91%] tests/test_xtae_calendar.py::TestXTAECalendar::test_regular_holidays_sample PASSED [ 91%] tests/test_xtae_calendar.py::TestXTAECalendar::test_adhoc_holidays_sample PASSED [ 91%] tests/test_xtae_calendar.py::TestXTAECalendar::test_non_holidays_sample PASSED [ 91%] tests/test_xtae_calendar.py::TestXTAECalendar::test_late_opens_sample PASSED [ 91%] tests/test_xtae_calendar.py::TestXTAECalendar::test_early_closes_sample PASSED [ 91%] tests/test_xtae_calendar.py::TestXTAECalendar::test_early_closes_sample_time PASSED [ 91%] tests/test_xtae_calendar.py::TestXTAECalendar::test_early_closes_weekdays PASSED [ 91%] tests/test_xtae_calendar.py::TestXTAECalendar::test_early_closes_weekdays_time PASSED [ 91%] tests/test_xtae_calendar.py::TestXTAECalendar::test_non_early_closes_sample PASSED [ 91%] tests/test_xtae_calendar.py::TestXTAECalendar::test_non_early_closes_sample_time PASSED [ 91%] tests/test_xtae_calendar.py::TestXTAECalendar::test_late_opens PASSED [ 91%] tests/test_xtae_calendar.py::TestXTAECalendar::test_early_closes PASSED [ 91%] tests/test_xtae_calendar.py::TestXTAECalendar::test_session_open_close_break_start_end PASSED [ 91%] tests/test_xtae_calendar.py::TestXTAECalendar::test_session_has_break PASSED [ 91%] tests/test_xtae_calendar.py::TestXTAECalendar::test_next_prev_session PASSED [ 91%] tests/test_xtae_calendar.py::TestXTAECalendar::test_session_offset PASSED [ 91%] tests/test_xtae_calendar.py::TestXTAECalendar::test_is_session PASSED [ 91%] tests/test_xtae_calendar.py::TestXTAECalendar::test_date_to_session PASSED [ 91%] tests/test_xtae_calendar.py::TestXTAECalendar::test_prev_next_open_close PASSED [ 91%] tests/test_xtae_calendar.py::TestXTAECalendar::test_sessions_in_range PASSED [ 91%] tests/test_xtae_calendar.py::TestXTAECalendar::test_sessions_has_break PASSED [ 91%] tests/test_xtae_calendar.py::TestXTAECalendar::test_sessions_window PASSED [ 91%] tests/test_xtae_calendar.py::TestXTAECalendar::test_sessions_distance PASSED [ 91%] tests/test_xtae_calendar.py::TestXTAECalendar::test_trading_index FAILED [ 91%] tests/test_xtae_calendar.py::TestXTAECalendar::test_deprecated PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_testbase_integrity PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_base_integrity PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_calculated_against_csv PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_start_end PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_invalid_input PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_bound_min PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_bound_max PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_sanity_check_session_lengths PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_adhoc_holidays_specification PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_daylight_savings PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_sessions PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_opens_closes_break_starts_ends PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minutes_properties[both] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minutes[both] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_calendar_bounds_properties[both] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_session_minute_methods[both] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_session_minutes[both] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_is_trading_minute[both] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_is_break_minute[both] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_is_open_on_minute[both] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_is_open_at_time[both] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_prev_next_minute[both] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_to_session[both-next] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_to_trading_minute[both-next] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_to_session[left-next] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_to_trading_minute[left-next] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minutes_properties[left] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minutes[left] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_calendar_bounds_properties[left] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_session_minute_methods[left] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_session_minutes[left] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_is_trading_minute[left] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_is_break_minute[left] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_is_open_on_minute[left] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_is_open_at_time[left] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_prev_next_minute[left] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_to_session[left-previous] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_to_trading_minute[left-previous] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_to_session[both-previous] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_to_trading_minute[both-previous] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_to_session[right-previous] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_to_trading_minute[right-previous] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_to_session[right-next] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_to_trading_minute[right-next] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minutes_properties[right] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minutes[right] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_calendar_bounds_properties[right] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_session_minute_methods[right] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_session_minutes[right] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_is_trading_minute[right] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_is_break_minute[right] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_is_open_on_minute[right] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_is_open_at_time[right] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_prev_next_minute[right] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_to_session[right-none] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_to_trading_minute[right-none] PASSED [ 91%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_to_session[left-none] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_to_trading_minute[left-none] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_to_session[both-none] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_to_trading_minute[both-none] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_to_session[neither-none] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_to_trading_minute[neither-none] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_to_session[neither-previous] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_to_session[neither-next] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_to_trading_minute[neither-next] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minutes_properties[neither] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minutes[neither] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_calendar_bounds_properties[neither] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_session_minute_methods[neither] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_session_minutes[neither] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_is_trading_minute[neither] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_is_break_minute[neither] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_is_open_on_minute[neither] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_is_open_at_time[neither] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_prev_next_minute[neither] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_to_past_session[neither] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_to_future_session[neither] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_offset[neither] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_offset_by_sessions[neither] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minutes_in_range[neither] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minutes_window[neither] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minutes_distance[neither] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minutes_to_sessions[neither] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_sessions_minutes[neither] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_sessions_minutes_count[neither] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_to_past_session[right] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_to_future_session[right] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_offset[right] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_offset_by_sessions[right] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minutes_in_range[right] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minutes_window[right] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minutes_distance[right] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minutes_to_sessions[right] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_sessions_minutes[right] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_sessions_minutes_count[right] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_to_past_session[left] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_to_future_session[left] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_offset[left] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_offset_by_sessions[left] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minutes_in_range[left] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minutes_window[left] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minutes_distance[left] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minutes_to_sessions[left] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_sessions_minutes[left] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_sessions_minutes_count[left] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_to_past_session[both] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_to_future_session[both] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_offset[both] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minute_offset_by_sessions[both] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minutes_in_range[both] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minutes_window[both] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minutes_distance[both] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_minutes_to_sessions[both] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_sessions_minutes[both] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_sessions_minutes_count[both] PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_has_break PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_regular_holidays_sample PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_adhoc_holidays_sample PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_non_holidays_sample PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_late_opens_sample PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_early_closes_sample PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_early_closes_sample_time PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_early_closes_weekdays PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_early_closes_weekdays_time PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_non_early_closes_sample PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_non_early_closes_sample_time PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_late_opens PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_early_closes PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_session_open_close_break_start_end PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_session_has_break PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_next_prev_session PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_session_offset PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_is_session PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_date_to_session PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_prev_next_open_close PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_sessions_in_range PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_sessions_has_break PASSED [ 92%] tests/test_xtai_calendar.py::TestXTAICalendar::test_sessions_window PASSED [ 93%] tests/test_xtai_calendar.py::TestXTAICalendar::test_sessions_distance PASSED [ 93%] tests/test_xtai_calendar.py::TestXTAICalendar::test_trading_index FAILED [ 93%] tests/test_xtai_calendar.py::TestXTAICalendar::test_deprecated PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_testbase_integrity PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_base_integrity PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_calculated_against_csv PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_start_end PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_invalid_input PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_bound_min PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_bound_max PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_sanity_check_session_lengths PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_adhoc_holidays_specification PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_daylight_savings PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_sessions PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_opens_closes_break_starts_ends PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minutes_properties[both] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minutes[both] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_calendar_bounds_properties[both] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_session_minute_methods[both] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_session_minutes[both] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_is_trading_minute[both] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_is_break_minute[both] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_is_open_on_minute[both] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_is_open_at_time[both] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_prev_next_minute[both] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_to_session[both-next] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_to_trading_minute[both-next] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_to_session[left-next] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_to_trading_minute[left-next] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minutes_properties[left] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minutes[left] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_calendar_bounds_properties[left] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_session_minute_methods[left] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_session_minutes[left] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_is_trading_minute[left] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_is_break_minute[left] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_is_open_on_minute[left] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_is_open_at_time[left] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_prev_next_minute[left] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_to_session[left-previous] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_to_session[both-previous] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_to_session[right-previous] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_to_session[right-next] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_to_trading_minute[right-next] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minutes_properties[right] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minutes[right] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_calendar_bounds_properties[right] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_session_minute_methods[right] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_session_minutes[right] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_is_trading_minute[right] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_is_break_minute[right] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_is_open_on_minute[right] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_is_open_at_time[right] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_prev_next_minute[right] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_to_session[right-none] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_to_trading_minute[right-none] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_to_session[left-none] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_to_trading_minute[left-none] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_to_session[both-none] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_to_trading_minute[both-none] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_to_session[neither-none] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_to_session[neither-previous] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_to_session[neither-next] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minutes_properties[neither] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minutes[neither] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_calendar_bounds_properties[neither] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_session_minute_methods[neither] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_session_minutes[neither] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_is_trading_minute[neither] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_is_break_minute[neither] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_is_open_on_minute[neither] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_is_open_at_time[neither] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_prev_next_minute[neither] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_to_past_session[neither] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_to_future_session[neither] PASSED [ 93%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_offset[neither] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_offset_by_sessions[neither] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minutes_in_range[neither] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minutes_window[neither] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minutes_distance[neither] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minutes_to_sessions[neither] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_sessions_minutes[neither] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_sessions_minutes_count[neither] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_to_past_session[right] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_to_future_session[right] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_offset[right] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_offset_by_sessions[right] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minutes_in_range[right] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minutes_window[right] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minutes_distance[right] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minutes_to_sessions[right] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_sessions_minutes[right] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_sessions_minutes_count[right] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_to_past_session[left] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_to_future_session[left] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_offset[left] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_offset_by_sessions[left] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minutes_in_range[left] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minutes_window[left] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minutes_distance[left] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minutes_to_sessions[left] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_sessions_minutes[left] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_sessions_minutes_count[left] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_to_past_session[both] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_to_future_session[both] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_offset[both] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minute_offset_by_sessions[both] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minutes_in_range[both] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minutes_window[both] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minutes_distance[both] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_minutes_to_sessions[both] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_sessions_minutes[both] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_sessions_minutes_count[both] PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_has_break PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_regular_holidays_sample PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_adhoc_holidays_sample PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_non_holidays_sample PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_late_opens_sample PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_early_closes_sample PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_early_closes_sample_time PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_early_closes_weekdays PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_early_closes_weekdays_time PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_non_early_closes_sample PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_non_early_closes_sample_time PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_late_opens PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_early_closes PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_session_open_close_break_start_end PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_session_has_break PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_next_prev_session PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_session_offset PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_is_session PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_date_to_session PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_prev_next_open_close PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_sessions_in_range PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_sessions_has_break PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_sessions_window PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_sessions_distance PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_trading_index FAILED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_deprecated PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_golden_week_holidays PASSED [ 94%] tests/test_xtks_calendar.py::TestXTKSCalendar::test_emperors_birthday PASSED [ 94%] tests/test_xtse_calendar.py::TestXTSECalendar::test_testbase_integrity PASSED [ 94%] tests/test_xtse_calendar.py::TestXTSECalendar::test_base_integrity PASSED [ 94%] tests/test_xtse_calendar.py::TestXTSECalendar::test_calculated_against_csv PASSED [ 94%] tests/test_xtse_calendar.py::TestXTSECalendar::test_start_end PASSED [ 94%] tests/test_xtse_calendar.py::TestXTSECalendar::test_invalid_input PASSED [ 94%] tests/test_xtse_calendar.py::TestXTSECalendar::test_bound_min PASSED [ 94%] tests/test_xtse_calendar.py::TestXTSECalendar::test_bound_max PASSED [ 94%] tests/test_xtse_calendar.py::TestXTSECalendar::test_sanity_check_session_lengths PASSED [ 94%] tests/test_xtse_calendar.py::TestXTSECalendar::test_adhoc_holidays_specification PASSED [ 94%] tests/test_xtse_calendar.py::TestXTSECalendar::test_daylight_savings PASSED [ 94%] tests/test_xtse_calendar.py::TestXTSECalendar::test_sessions PASSED [ 94%] tests/test_xtse_calendar.py::TestXTSECalendar::test_opens_closes_break_starts_ends PASSED [ 94%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minutes_properties[both] PASSED [ 94%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minutes[both] PASSED [ 94%] tests/test_xtse_calendar.py::TestXTSECalendar::test_calendar_bounds_properties[both] PASSED [ 94%] tests/test_xtse_calendar.py::TestXTSECalendar::test_session_minute_methods[both] PASSED [ 94%] tests/test_xtse_calendar.py::TestXTSECalendar::test_session_minutes[both] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_is_trading_minute[both] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_is_break_minute[both] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_is_open_on_minute[both] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_is_open_at_time[both] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_prev_next_minute[both] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_to_session[both-next] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_to_trading_minute[both-next] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_to_session[left-next] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_to_trading_minute[left-next] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minutes_properties[left] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minutes[left] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_calendar_bounds_properties[left] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_session_minute_methods[left] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_session_minutes[left] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_is_trading_minute[left] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_is_break_minute[left] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_is_open_on_minute[left] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_is_open_at_time[left] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_prev_next_minute[left] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_to_session[left-previous] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_to_trading_minute[left-previous] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_to_session[both-previous] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_to_trading_minute[both-previous] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_to_session[right-previous] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_to_trading_minute[right-previous] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_to_session[right-next] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_to_trading_minute[right-next] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minutes_properties[right] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minutes[right] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_calendar_bounds_properties[right] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_session_minute_methods[right] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_session_minutes[right] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_is_trading_minute[right] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_is_break_minute[right] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_is_open_on_minute[right] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_is_open_at_time[right] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_prev_next_minute[right] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_to_session[right-none] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_to_trading_minute[right-none] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_to_session[left-none] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_to_trading_minute[left-none] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_to_session[both-none] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_to_trading_minute[both-none] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_to_session[neither-none] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_to_trading_minute[neither-none] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_to_session[neither-previous] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_to_session[neither-next] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_to_trading_minute[neither-next] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minutes_properties[neither] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minutes[neither] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_calendar_bounds_properties[neither] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_session_minute_methods[neither] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_session_minutes[neither] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_is_trading_minute[neither] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_is_break_minute[neither] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_is_open_on_minute[neither] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_is_open_at_time[neither] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_prev_next_minute[neither] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_to_past_session[neither] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_to_future_session[neither] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_offset[neither] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_offset_by_sessions[neither] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minutes_in_range[neither] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minutes_window[neither] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minutes_distance[neither] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minutes_to_sessions[neither] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_sessions_minutes[neither] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_sessions_minutes_count[neither] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_to_past_session[right] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_to_future_session[right] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_offset[right] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_offset_by_sessions[right] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minutes_in_range[right] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minutes_window[right] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minutes_distance[right] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minutes_to_sessions[right] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_sessions_minutes[right] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_sessions_minutes_count[right] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_to_past_session[left] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_to_future_session[left] PASSED [ 95%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_offset[left] PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_offset_by_sessions[left] PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minutes_in_range[left] PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minutes_window[left] PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minutes_distance[left] PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minutes_to_sessions[left] PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_sessions_minutes[left] PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_sessions_minutes_count[left] PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_to_past_session[both] PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_to_future_session[both] PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_offset[both] PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minute_offset_by_sessions[both] PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minutes_in_range[both] PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minutes_window[both] PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minutes_distance[both] PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_minutes_to_sessions[both] PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_sessions_minutes[both] PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_sessions_minutes_count[both] PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_has_break PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_regular_holidays_sample PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_adhoc_holidays_sample PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_non_holidays_sample PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_late_opens_sample PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_early_closes_sample PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_early_closes_sample_time PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_early_closes_weekdays PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_early_closes_weekdays_time PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_non_early_closes_sample PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_non_early_closes_sample_time PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_late_opens PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_early_closes PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_session_open_close_break_start_end PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_session_has_break PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_next_prev_session PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_session_offset PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_is_session PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_date_to_session PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_prev_next_open_close PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_sessions_in_range PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_sessions_has_break PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_sessions_window PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_sessions_distance PASSED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_trading_index FAILED [ 96%] tests/test_xtse_calendar.py::TestXTSECalendar::test_deprecated PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_testbase_integrity PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_base_integrity PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_calculated_against_csv PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_start_end PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_invalid_input PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_bound_min PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_bound_max PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_sanity_check_session_lengths PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_adhoc_holidays_specification PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_daylight_savings PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_sessions PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_opens_closes_break_starts_ends PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minutes_properties[both] PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minutes[both] PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_calendar_bounds_properties[both] PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_session_minute_methods[both] PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_session_minutes[both] PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_is_trading_minute[both] PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_is_break_minute[both] PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_is_open_on_minute[both] PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_is_open_at_time[both] PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_prev_next_minute[both] PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_to_session[both-next] PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_to_trading_minute[both-next] PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_to_session[left-next] PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_to_trading_minute[left-next] PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minutes_properties[left] PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minutes[left] PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_calendar_bounds_properties[left] PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_session_minute_methods[left] PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_session_minutes[left] PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_is_trading_minute[left] PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_is_break_minute[left] PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_is_open_on_minute[left] PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_is_open_at_time[left] PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_prev_next_minute[left] PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_to_session[left-previous] PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 96%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_to_session[both-previous] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_to_session[right-previous] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_to_session[right-next] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_to_trading_minute[right-next] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minutes_properties[right] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minutes[right] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_calendar_bounds_properties[right] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_session_minute_methods[right] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_session_minutes[right] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_is_trading_minute[right] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_is_break_minute[right] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_is_open_on_minute[right] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_is_open_at_time[right] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_prev_next_minute[right] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_to_session[right-none] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_to_trading_minute[right-none] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_to_session[left-none] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_to_trading_minute[left-none] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_to_session[both-none] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_to_trading_minute[both-none] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_to_session[neither-none] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_to_session[neither-previous] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_to_session[neither-next] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minutes_properties[neither] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minutes[neither] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_calendar_bounds_properties[neither] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_session_minute_methods[neither] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_session_minutes[neither] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_is_trading_minute[neither] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_is_break_minute[neither] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_is_open_on_minute[neither] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_is_open_at_time[neither] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_prev_next_minute[neither] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_to_past_session[neither] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_to_future_session[neither] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_offset[neither] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_offset_by_sessions[neither] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minutes_in_range[neither] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minutes_window[neither] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minutes_distance[neither] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minutes_to_sessions[neither] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_sessions_minutes[neither] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_sessions_minutes_count[neither] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_to_past_session[right] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_to_future_session[right] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_offset[right] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_offset_by_sessions[right] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minutes_in_range[right] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minutes_window[right] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minutes_distance[right] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minutes_to_sessions[right] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_sessions_minutes[right] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_sessions_minutes_count[right] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_to_past_session[left] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_to_future_session[left] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_offset[left] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_offset_by_sessions[left] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minutes_in_range[left] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minutes_window[left] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minutes_distance[left] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minutes_to_sessions[left] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_sessions_minutes[left] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_sessions_minutes_count[left] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_to_past_session[both] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_to_future_session[both] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_offset[both] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minute_offset_by_sessions[both] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minutes_in_range[both] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minutes_window[both] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minutes_distance[both] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_minutes_to_sessions[both] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_sessions_minutes[both] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_sessions_minutes_count[both] PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_has_break PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_regular_holidays_sample PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_adhoc_holidays_sample PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_non_holidays_sample PASSED [ 97%] tests/test_xwar_calendar.py::TestXWARCalendar::test_late_opens_sample PASSED [ 98%] tests/test_xwar_calendar.py::TestXWARCalendar::test_early_closes_sample PASSED [ 98%] tests/test_xwar_calendar.py::TestXWARCalendar::test_early_closes_sample_time PASSED [ 98%] tests/test_xwar_calendar.py::TestXWARCalendar::test_early_closes_weekdays PASSED [ 98%] tests/test_xwar_calendar.py::TestXWARCalendar::test_early_closes_weekdays_time PASSED [ 98%] tests/test_xwar_calendar.py::TestXWARCalendar::test_non_early_closes_sample PASSED [ 98%] tests/test_xwar_calendar.py::TestXWARCalendar::test_non_early_closes_sample_time PASSED [ 98%] tests/test_xwar_calendar.py::TestXWARCalendar::test_late_opens PASSED [ 98%] tests/test_xwar_calendar.py::TestXWARCalendar::test_early_closes PASSED [ 98%] tests/test_xwar_calendar.py::TestXWARCalendar::test_session_open_close_break_start_end PASSED [ 98%] tests/test_xwar_calendar.py::TestXWARCalendar::test_session_has_break PASSED [ 98%] tests/test_xwar_calendar.py::TestXWARCalendar::test_next_prev_session PASSED [ 98%] tests/test_xwar_calendar.py::TestXWARCalendar::test_session_offset PASSED [ 98%] tests/test_xwar_calendar.py::TestXWARCalendar::test_is_session PASSED [ 98%] tests/test_xwar_calendar.py::TestXWARCalendar::test_date_to_session PASSED [ 98%] tests/test_xwar_calendar.py::TestXWARCalendar::test_prev_next_open_close PASSED [ 98%] tests/test_xwar_calendar.py::TestXWARCalendar::test_sessions_in_range PASSED [ 98%] tests/test_xwar_calendar.py::TestXWARCalendar::test_sessions_has_break PASSED [ 98%] tests/test_xwar_calendar.py::TestXWARCalendar::test_sessions_window PASSED [ 98%] tests/test_xwar_calendar.py::TestXWARCalendar::test_sessions_distance PASSED [ 98%] tests/test_xwar_calendar.py::TestXWARCalendar::test_trading_index FAILED [ 98%] tests/test_xwar_calendar.py::TestXWARCalendar::test_deprecated PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_testbase_integrity PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_base_integrity PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_calculated_against_csv PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_start_end PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_invalid_input PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_bound_min PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_bound_max PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_sanity_check_session_lengths PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_adhoc_holidays_specification PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_daylight_savings PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_sessions PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_opens_closes_break_starts_ends PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minutes_properties[both] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minutes[both] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_calendar_bounds_properties[both] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_session_minute_methods[both] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_session_minutes[both] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_is_trading_minute[both] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_is_break_minute[both] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_is_open_on_minute[both] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_is_open_at_time[both] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_prev_next_minute[both] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_to_session[both-next] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_to_trading_minute[both-next] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_to_session[left-next] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_to_trading_minute[left-next] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minutes_properties[left] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minutes[left] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_calendar_bounds_properties[left] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_session_minute_methods[left] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_session_minutes[left] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_is_trading_minute[left] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_is_break_minute[left] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_is_open_on_minute[left] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_is_open_at_time[left] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_prev_next_minute[left] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_to_session[left-previous] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_to_trading_minute[left-previous] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_to_session[both-previous] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_to_trading_minute[both-previous] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_to_session[right-previous] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_to_trading_minute[right-previous] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_to_session[right-next] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_to_trading_minute[right-next] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minutes_properties[right] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minutes[right] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_calendar_bounds_properties[right] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_session_minute_methods[right] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_session_minutes[right] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_is_trading_minute[right] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_is_break_minute[right] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_is_open_on_minute[right] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_is_open_at_time[right] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_prev_next_minute[right] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_to_session[right-none] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_to_trading_minute[right-none] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_to_session[left-none] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_to_trading_minute[left-none] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_to_session[both-none] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_to_trading_minute[both-none] PASSED [ 98%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_to_session[neither-none] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_to_trading_minute[neither-none] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_to_session[neither-previous] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_to_trading_minute[neither-previous] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_to_session[neither-next] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_to_trading_minute[neither-next] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minutes_properties[neither] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minutes[neither] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_calendar_bounds_properties[neither] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_session_minute_methods[neither] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_session_minutes[neither] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_is_trading_minute[neither] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_is_break_minute[neither] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_is_open_on_minute[neither] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_is_open_at_time[neither] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_prev_next_minute[neither] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_to_past_session[neither] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_to_future_session[neither] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_offset[neither] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_offset_by_sessions[neither] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minutes_in_range[neither] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minutes_window[neither] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minutes_distance[neither] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minutes_to_sessions[neither] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_sessions_minutes[neither] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_sessions_minutes_count[neither] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_to_past_session[right] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_to_future_session[right] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_offset[right] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_offset_by_sessions[right] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minutes_in_range[right] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minutes_window[right] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minutes_distance[right] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minutes_to_sessions[right] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_sessions_minutes[right] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_sessions_minutes_count[right] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_to_past_session[left] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_to_future_session[left] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_offset[left] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_offset_by_sessions[left] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minutes_in_range[left] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minutes_window[left] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minutes_distance[left] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minutes_to_sessions[left] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_sessions_minutes[left] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_sessions_minutes_count[left] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_to_past_session[both] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_to_future_session[both] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_offset[both] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minute_offset_by_sessions[both] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minutes_in_range[both] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minutes_window[both] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minutes_distance[both] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_minutes_to_sessions[both] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_sessions_minutes[both] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_sessions_minutes_count[both] PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_has_break PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_regular_holidays_sample PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_adhoc_holidays_sample PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_non_holidays_sample PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_late_opens_sample PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_early_closes_sample PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_early_closes_sample_time PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_early_closes_weekdays PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_early_closes_weekdays_time PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_non_early_closes_sample PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_non_early_closes_sample_time PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_late_opens PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_early_closes PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_session_open_close_break_start_end PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_session_has_break PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_next_prev_session PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_session_offset PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_is_session PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_date_to_session PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_prev_next_open_close PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_sessions_in_range PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_sessions_has_break PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_sessions_window PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_sessions_distance PASSED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_trading_index FAILED [ 99%] tests/test_xwbo_calendar.py::TestXWBOCalendar::test_deprecated PASSED [100%] =================================== FAILURES =================================== _____________________ TestAIXKCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([1556168400000000000, 1556254800000000000, 1556514000000000000], dtype=int64) end_nanos = array([1556190000000000000, 1556276400000000000, 1556535600000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError __________________ TestAlwaysOpenCalendar.test_trading_index ___________________ self = calendars = {'left': , 'right': } answers = {'left': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) tst_indices_index(both_index, "both", both_overlaps) > tst_indices_index(left_index, "left", False) tests/test_exchange_calendar.py:3907: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([1462147200000000000, 1462233600000000000, 1462320000000000000], dtype=int64) end_nanos = array([1462233600000000000, 1462320000000000000, 1462406400000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestASEXCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([953107200000000000, 953193600000000000, 953280000000000000], dtype=int64) end_nanos = array([953132400000000000, 953218800000000000, 953305200000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestBVMFCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([981374400000000000, 981460800000000000, 981547200000000000], dtype=int64) end_nanos = array([981399600000000000, 981486000000000000, 981572400000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError ___________________ TestTradingIndex.test_indices_fuzz[XLON] ___________________ self = calendars_with_answers = (, ) one_min = Timedelta('0 days 00:01:00') @given( > data=st.data(), force_close=st.booleans(), force_break_close=st.booleans(), align=st_align(), align_pm=st_align(), ) tests/test_calendar_helpers.py:666: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_calendar_helpers.py:768: in test_indices_fuzz index = ti.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([638179200000000000, 638434800000000000], dtype=int64) end_nanos = array([638209800000000000, 638465400000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' E Falsifying example: test_indices_fuzz( E self=, E calendars_with_answers=(, E ), E one_min=Timedelta('0 days 00:01:00'), E data=data(...), E force_close=False, # or any other generated value E force_break_close=False, # or any other generated value E align=Timedelta('0 days 00:01:00'), # or any other generated value E align_pm=Timedelta('0 days 00:01:00'), # or any other generated value E ) E Draw 1: (Timestamp('1990-03-23 00:00:00'), Timestamp('1990-03-26 00:00:00')) E Draw 2: 'left' E Draw 3: Timedelta('0 days 00:01:00') exchange_calendars/calendar_helpers.py:602: TypeError __________________ TestTradingIndex.test_intervals_fuzz[XLON] __________________ self = calendars_with_answers = (, ) one_min = Timedelta('0 days 00:01:00') @given( > data=st.data(), force_break_close=st.booleans(), curtail=st.booleans(), align=st_align(), align_pm=st_align(), ) tests/test_calendar_helpers.py:789: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_calendar_helpers.py:868: in test_intervals_fuzz index = ti.trading_index_intervals() exchange_calendars/calendar_helpers.py:696: in trading_index_intervals left = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([638179200000000000, 638434800000000000], dtype=int64) end_nanos = array([638209800000000000, 638465400000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' E Falsifying example: test_intervals_fuzz( E self=, E calendars_with_answers=(, E ), E one_min=Timedelta('0 days 00:01:00'), E data=data(...), E force_break_close=False, # or any other generated value E curtail=False, # or any other generated value E align=Timedelta('0 days 00:01:00'), # or any other generated value E align_pm=Timedelta('0 days 00:01:00'), # or any other generated value E ) E Draw 1: (Timestamp('1990-03-23 00:00:00'), Timestamp('1990-03-26 00:00:00')) E Draw 2: False E Draw 3: 'left' E Draw 4: Timedelta('0 days 00:01:00') exchange_calendars/calendar_helpers.py:602: TypeError ___________________ TestTradingIndex.test_indices_fuzz[XHKG] ___________________ self = calendars_with_answers = (, ) one_min = Timedelta('0 days 00:01:00') @given( > data=st.data(), force_close=st.booleans(), force_break_close=st.booleans(), align=st_align(), align_pm=st_align(), ) tests/test_calendar_helpers.py:666: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_calendar_helpers.py:768: in test_indices_fuzz index = ti.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:632: in _trading_index index_am = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([1009936800000000000, 1010023200000000000, 1010109600000000000, 1010368800000000000, 1010455200000000000,...3200000000000, 1040349600000000000, 1040608800000000000, 1040954400000000000, 1041213600000000000], dtype=int64) end_nanos = array([1009944000000000000, 1010030400000000000, 1010116800000000000, 1010376000000000000, 1010462400000000000,...0400000000000, 1040356800000000000, 1040616000000000000, 1040961600000000000, 1041220800000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' E Falsifying example: test_indices_fuzz( E self=, E calendars_with_answers=(, E ), E one_min=Timedelta('0 days 00:01:00'), E data=data(...), E force_close=False, # or any other generated value E force_break_close=False, # or any other generated value E align=Timedelta('0 days 00:01:00'), # or any other generated value E align_pm=Timedelta('0 days 00:01:00'), # or any other generated value E ) E Draw 1: (Timestamp('2002-01-01 00:00:00'), Timestamp('2003-01-01 00:00:00')) E Draw 2: 'neither' E Draw 3: Timedelta('0 days 00:01:00') exchange_calendars/calendar_helpers.py:602: TypeError __________________ TestTradingIndex.test_intervals_fuzz[XHKG] __________________ self = calendars_with_answers = (, ) one_min = Timedelta('0 days 00:01:00') @given( > data=st.data(), force_break_close=st.booleans(), curtail=st.booleans(), align=st_align(), align_pm=st_align(), ) tests/test_calendar_helpers.py:789: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_calendar_helpers.py:868: in test_intervals_fuzz index = ti.trading_index_intervals() exchange_calendars/calendar_helpers.py:696: in trading_index_intervals left = self._trading_index() exchange_calendars/calendar_helpers.py:632: in _trading_index index_am = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([661744800000000000], dtype=int64) end_nanos = array([661752000000000000], dtype=int64), force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' E Falsifying example: test_intervals_fuzz( E self=, E calendars_with_answers=(, E ), E one_min=Timedelta('0 days 00:01:00'), E data=data(...), E force_break_close=False, # or any other generated value E curtail=False, # or any other generated value E align=Timedelta('0 days 00:01:00'), # or any other generated value E align_pm=Timedelta('0 days 00:01:00'), # or any other generated value E ) E Draw 1: (Timestamp('1990-12-21 00:00:00'), Timestamp('1990-12-24 00:00:00')) E Draw 2: False E Draw 3: 'left' E Draw 4: Timedelta('0 days 00:01:00') exchange_calendars/calendar_helpers.py:602: TypeError ___________________ TestTradingIndex.test_indices_fuzz[XTAE] ___________________ self = calendars_with_answers = (, ) one_min = Timedelta('0 days 00:01:00') @given( > data=st.data(), force_close=st.booleans(), force_break_close=st.booleans(), align=st_align(), align_pm=st_align(), ) tests/test_calendar_helpers.py:666: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_calendar_helpers.py:768: in test_indices_fuzz index = ti.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([1546502340000000000, 1546761540000000000], dtype=int64) end_nanos = array([1546528500000000000, 1546782000000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' E Falsifying example: test_indices_fuzz( E self=, E calendars_with_answers=(, E ), E one_min=Timedelta('0 days 00:01:00'), E data=data(...), E force_close=False, # or any other generated value E force_break_close=False, # or any other generated value E align=Timedelta('0 days 00:01:00'), # or any other generated value E align_pm=Timedelta('0 days 00:01:00'), # or any other generated value E ) E Draw 1: (Timestamp('2019-01-03 00:00:00'), Timestamp('2019-01-06 00:00:00')) E Draw 2: 'left' E Draw 3: Timedelta('0 days 00:01:00') exchange_calendars/calendar_helpers.py:602: TypeError __________________ TestTradingIndex.test_intervals_fuzz[XTAE] __________________ self = calendars_with_answers = (, ) one_min = Timedelta('0 days 00:01:00') @given( > data=st.data(), force_break_close=st.booleans(), curtail=st.booleans(), align=st_align(), align_pm=st_align(), ) tests/test_calendar_helpers.py:789: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_calendar_helpers.py:868: in test_intervals_fuzz index = ti.trading_index_intervals() exchange_calendars/calendar_helpers.py:696: in trading_index_intervals left = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([1546502340000000000, 1546761540000000000], dtype=int64) end_nanos = array([1546528500000000000, 1546782000000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' E Falsifying example: test_intervals_fuzz( E self=, E calendars_with_answers=(, E ), E one_min=Timedelta('0 days 00:01:00'), E data=data(...), E force_break_close=False, # or any other generated value E curtail=False, # or any other generated value E align=Timedelta('0 days 00:01:00'), # or any other generated value E align_pm=Timedelta('0 days 00:01:00'), # or any other generated value E ) E Draw 1: (Timestamp('2019-01-03 00:00:00'), Timestamp('2019-01-06 00:00:00')) E Draw 2: False E Draw 3: 'left' E Draw 4: Timedelta('0 days 00:01:00') exchange_calendars/calendar_helpers.py:602: TypeError ___________________ TestTradingIndex.test_indices_fuzz[CMES] ___________________ self = calendars_with_answers = (, ) one_min = Timedelta('0 days 00:01:00') @given( > data=st.data(), force_close=st.booleans(), force_break_close=st.booleans(), align=st_align(), align_pm=st_align(), ) tests/test_calendar_helpers.py:666: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_calendar_helpers.py:768: in test_indices_fuzz index = ti.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([635122800000000000, 635382000000000000], dtype=int64) end_nanos = array([635209200000000000, 635450400000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' E Falsifying example: test_indices_fuzz( E self=, E calendars_with_answers=(, E ), E one_min=Timedelta('0 days 00:01:00'), E data=data(...), E force_close=False, # or any other generated value E force_break_close=False, # or any other generated value E align=Timedelta('0 days 00:01:00'), # or any other generated value E align_pm=Timedelta('0 days 00:01:00'), # or any other generated value E ) E Draw 1: (Timestamp('1990-02-16 00:00:00'), Timestamp('1990-02-19 00:00:00')) E Draw 2: 'left' E Draw 3: Timedelta('0 days 00:01:00') exchange_calendars/calendar_helpers.py:602: TypeError __________________ TestTradingIndex.test_intervals_fuzz[CMES] __________________ self = calendars_with_answers = (, ) one_min = Timedelta('0 days 00:01:00') @given( > data=st.data(), force_break_close=st.booleans(), curtail=st.booleans(), align=st_align(), align_pm=st_align(), ) tests/test_calendar_helpers.py:789: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_calendar_helpers.py:868: in test_intervals_fuzz index = ti.trading_index_intervals() exchange_calendars/calendar_helpers.py:696: in trading_index_intervals left = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([635122800000000000, 635382000000000000], dtype=int64) end_nanos = array([635209200000000000, 635450400000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' E Falsifying example: test_intervals_fuzz( E self=, E calendars_with_answers=(, E ), E one_min=Timedelta('0 days 00:01:00'), E data=data(...), E force_break_close=False, # or any other generated value E curtail=False, # or any other generated value E align=Timedelta('0 days 00:01:00'), # or any other generated value E align_pm=Timedelta('0 days 00:01:00'), # or any other generated value E ) E Draw 1: (Timestamp('1990-02-16 00:00:00'), Timestamp('1990-02-19 00:00:00')) E Draw 2: False E Draw 3: 'left' E Draw 4: Timedelta('0 days 00:01:00') exchange_calendars/calendar_helpers.py:602: TypeError ___________________ TestTradingIndex.test_indices_fuzz[24/7] ___________________ self = calendars_with_answers = (, ) one_min = Timedelta('0 days 00:01:00') @given( > data=st.data(), force_close=st.booleans(), force_break_close=st.booleans(), align=st_align(), align_pm=st_align(), ) tests/test_calendar_helpers.py:666: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_calendar_helpers.py:768: in test_indices_fuzz index = ti.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([1451606400000000000, 1451692800000000000, 1451779200000000000, 1451865600000000000, 1451952000000000000,...0000000, 1452556800000000000, 1452643200000000000, 1452729600000000000, 1452816000000000000], dtype=int64) end_nanos = array([1451692800000000000, 1451779200000000000, 1451865600000000000, 1451952000000000000, 1452038400000000000,...0000000, 1452643200000000000, 1452729600000000000, 1452816000000000000, 1452902400000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' E Falsifying example: test_indices_fuzz( E self=, E calendars_with_answers=(, E ), E one_min=Timedelta('0 days 00:01:00'), E data=data(...), E force_close=False, # or any other generated value E force_break_close=False, # or any other generated value E align=Timedelta('0 days 00:01:00'), # or any other generated value E align_pm=Timedelta('0 days 00:01:00'), # or any other generated value E ) E Draw 1: (Timestamp('2016-01-01 00:00:00'), Timestamp('2016-01-15 00:00:00')) E Draw 2: 'left' E Draw 3: Timedelta('0 days 00:01:00') exchange_calendars/calendar_helpers.py:602: TypeError __________________ TestTradingIndex.test_intervals_fuzz[24/7] __________________ self = calendars_with_answers = (, ) one_min = Timedelta('0 days 00:01:00') @given( > data=st.data(), force_break_close=st.booleans(), curtail=st.booleans(), align=st_align(), align_pm=st_align(), ) tests/test_calendar_helpers.py:789: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_calendar_helpers.py:868: in test_intervals_fuzz index = ti.trading_index_intervals() exchange_calendars/calendar_helpers.py:696: in trading_index_intervals left = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([1456185600000000000, 1456272000000000000], dtype=int64) end_nanos = array([1456272000000000000, 1456358400000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' E Falsifying example: test_intervals_fuzz( E self=, E calendars_with_answers=(, E ), E one_min=Timedelta('0 days 00:01:00'), E data=data(...), E force_break_close=False, # or any other generated value E curtail=False, # or any other generated value E align=Timedelta('0 days 00:01:00'), # or any other generated value E align_pm=Timedelta('0 days 00:01:00'), # or any other generated value E ) E Draw 1: (Timestamp('2016-02-23 00:00:00'), Timestamp('2016-02-24 00:00:00')) E Draw 2: False E Draw 3: 'left' E Draw 4: Timedelta('0 days 00:01:00') exchange_calendars/calendar_helpers.py:602: TypeError ______________ TestTradingIndex.test_for_empty_with_neither_fuzz _______________ self = calendars = {'24/7': , 'CMES': , 'XLON': , ...} answers = {'24/7': , 'CMES': , 'XHKG': , 'XLON': , ...} one_min = Timedelta('0 days 00:01:00') @given(data=st.data(), calendar_name=st.sampled_from(["XLON", "XHKG"])) > @settings(deadline=None) tests/test_calendar_helpers.py:896: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_calendar_helpers.py:925: in test_for_empty_with_neither_fuzz index = ti.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([638179200000000000, 638434800000000000], dtype=int64) end_nanos = array([638209800000000000, 638465400000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' E Falsifying example: test_for_empty_with_neither_fuzz( E self=, E calendars={'XLON': , E 'XHKG': , E 'XTAE': , E 'CMES': , E '24/7': }, E answers={'XLON': , E 'XHKG': , E 'XTAE': , E 'CMES': , E '24/7': }, E one_min=Timedelta('0 days 00:01:00'), E data=data(...), E calendar_name='XLON', # or any other generated value E ) E Draw 1: (Timestamp('1990-03-23 00:00:00'), Timestamp('1990-03-26 00:00:00')) E Draw 2: Timedelta('0 days 08:30:00') exchange_calendars/calendar_helpers.py:602: TypeError ________________ TestTradingIndex.test_overlap_error_fuzz[XHKG] ________________ self = name = 'XHKG' calendars = {'24/7': , 'CMES': , 'XLON': , ...} answers = {'24/7': , 'CMES': , 'XHKG': , 'XLON': , ...} one_min = Timedelta('0 days 00:01:00') @pytest.mark.parametrize("name", ["XHKG", "24/7", "CMES"]) > @given(data=st.data(), closed=st.sampled_from(["right", "both"])) tests/test_calendar_helpers.py:968: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_calendar_helpers.py:1028: in test_overlap_error_fuzz ti.trading_index_intervals() exchange_calendars/calendar_helpers.py:696: in trading_index_intervals left = self._trading_index() exchange_calendars/calendar_helpers.py:632: in _trading_index index_am = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([661744800000000000], dtype=int64) end_nanos = array([661752000000000000], dtype=int64), force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' E Falsifying example: test_overlap_error_fuzz( E self=, E name='XHKG', E calendars={'XLON': , E 'XHKG': , E 'XTAE': , E 'CMES': , E '24/7': }, E answers={'XLON': , E 'XHKG': , E 'XTAE': , E 'CMES': , E '24/7': }, E one_min=Timedelta('0 days 00:01:00'), E data=data(...), E closed='right', E ) E Draw 1: (Timestamp('1990-12-21 00:00:00'), Timestamp('1990-12-24 00:00:00')) E Draw 2: Timedelta('0 days 01:31:00') E Explanation: E These lines were always and only run by failing examples: E /build/reproducible-path/exchange-calendars-4.5.5/.pybuild/cpython3_3.12_exchange-calendars/build/exchange_calendars/calendar_helpers.py:544 E /build/reproducible-path/exchange-calendars-4.5.5/.pybuild/cpython3_3.12_exchange-calendars/build/exchange_calendars/calendar_helpers.py:685 E /build/reproducible-path/exchange-calendars-4.5.5/.pybuild/cpython3_3.12_exchange-calendars/build/tests/test_calendar_helpers.py:1027 E /build/reproducible-path/exchange-calendars-4.5.5/.pybuild/cpython3_3.12_exchange-calendars/build/tests/test_calendar_helpers.py:1028 E /usr/lib/python3/dist-packages/_pytest/python_api.py:1014 E /usr/lib/python3/dist-packages/pandas/core/arraylike.py:56 exchange_calendars/calendar_helpers.py:602: TypeError ________________ TestTradingIndex.test_overlap_error_fuzz[24/7] ________________ self = name = '24/7' calendars = {'24/7': , 'CMES': , 'XLON': , ...} answers = {'24/7': , 'CMES': , 'XHKG': , 'XLON': , ...} one_min = Timedelta('0 days 00:01:00') @pytest.mark.parametrize("name", ["XHKG", "24/7", "CMES"]) > @given(data=st.data(), closed=st.sampled_from(["right", "both"])) tests/test_calendar_helpers.py:968: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_calendar_helpers.py:1028: in test_overlap_error_fuzz ti.trading_index_intervals() exchange_calendars/calendar_helpers.py:696: in trading_index_intervals left = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([1454284800000000000, 1454371200000000000], dtype=int64) end_nanos = array([1454371200000000000, 1454457600000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' E Falsifying example: test_overlap_error_fuzz( E self=, E name='24/7', E calendars={'XLON': , E 'XHKG': , E 'XTAE': , E 'CMES': , E '24/7': }, E answers={'XLON': , E 'XHKG': , E 'XTAE': , E 'CMES': , E '24/7': }, E one_min=Timedelta('0 days 00:01:00'), E data=data(...), E closed='right', E ) E Draw 1: (Timestamp('2016-02-01 00:00:00'), Timestamp('2016-02-02 00:00:00')) E Draw 2: Timedelta('0 days 00:17:00') E Explanation: E These lines were always and only run by failing examples: E /build/reproducible-path/exchange-calendars-4.5.5/.pybuild/cpython3_3.12_exchange-calendars/build/exchange_calendars/calendar_helpers.py:544 E /build/reproducible-path/exchange-calendars-4.5.5/.pybuild/cpython3_3.12_exchange-calendars/build/exchange_calendars/calendar_helpers.py:685 E /build/reproducible-path/exchange-calendars-4.5.5/.pybuild/cpython3_3.12_exchange-calendars/build/tests/test_calendar_helpers.py:1027 E /build/reproducible-path/exchange-calendars-4.5.5/.pybuild/cpython3_3.12_exchange-calendars/build/tests/test_calendar_helpers.py:1028 E /usr/lib/python3/dist-packages/_pytest/python_api.py:1014 E /usr/lib/python3/dist-packages/pandas/core/arraylike.py:56 exchange_calendars/calendar_helpers.py:602: TypeError ________________ TestTradingIndex.test_overlap_error_fuzz[CMES] ________________ self = name = 'CMES' calendars = {'24/7': , 'CMES': , 'XLON': , ...} answers = {'24/7': , 'CMES': , 'XHKG': , 'XLON': , ...} one_min = Timedelta('0 days 00:01:00') @pytest.mark.parametrize("name", ["XHKG", "24/7", "CMES"]) > @given(data=st.data(), closed=st.sampled_from(["right", "both"])) tests/test_calendar_helpers.py:968: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_calendar_helpers.py:1028: in test_overlap_error_fuzz ti.trading_index_intervals() exchange_calendars/calendar_helpers.py:696: in trading_index_intervals left = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([678492000000000000, 678578400000000000], dtype=int64) end_nanos = array([678578400000000000, 678646800000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' E Falsifying example: test_overlap_error_fuzz( E self=, E name='CMES', E calendars={'XLON': , E 'XHKG': , E 'XTAE': , E 'CMES': , E '24/7': }, E answers={'XLON': , E 'XHKG': , E 'XTAE': , E 'CMES': , E '24/7': }, E one_min=Timedelta('0 days 00:01:00'), E data=data(...), E closed='right', E ) E Draw 1: (Timestamp('1991-07-03 00:00:00'), Timestamp('1991-07-04 00:00:00')) E Draw 2: Timedelta('0 days 00:11:00') E Explanation: E These lines were always and only run by failing examples: E /build/reproducible-path/exchange-calendars-4.5.5/.pybuild/cpython3_3.12_exchange-calendars/build/exchange_calendars/calendar_helpers.py:544 E /build/reproducible-path/exchange-calendars-4.5.5/.pybuild/cpython3_3.12_exchange-calendars/build/exchange_calendars/calendar_helpers.py:685 E /build/reproducible-path/exchange-calendars-4.5.5/.pybuild/cpython3_3.12_exchange-calendars/build/tests/test_calendar_helpers.py:1027 E /build/reproducible-path/exchange-calendars-4.5.5/.pybuild/cpython3_3.12_exchange-calendars/build/tests/test_calendar_helpers.py:1028 E /usr/lib/python3/dist-packages/_pytest/python_api.py:1014 E /usr/lib/python3/dist-packages/pandas/core/arraylike.py:56 exchange_calendars/calendar_helpers.py:602: TypeError _____________ TestTradingIndex.test_overlaps[ti_for_overlap0-True] _____________ self = ti_for_overlap = answers = {'24/7': , 'CMES': , 'XHKG': , 'XLON': , ...} def test_overlaps(self, ti_for_overlap, answers): """Test 'curtail_overlaps' and for overlaps against concrete parameters.""" ti = ti_for_overlap period = pd.Timedelta(ti.interval_nanos) period_106 = period == pd.Timedelta("106min") if period_106 or ti.closed == "both": with pytest.raises(errors.IndicesOverlapError): ti.trading_index() if ti.closed == "both": return if not ti.curtail_overlaps and period_106: # won't raise on "105min" as right side of last interval of am # session won't clash on coinciding with left side of first # interval of pm session as one of these sides will always be # open (in this case the left side). NB can't close on both # sides. with pytest.raises(errors.IntervalsOverlapError): ti.trading_index_intervals() else: > index = ti.trading_index_intervals() tests/test_calendar_helpers.py:1095: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ exchange_calendars/calendar_helpers.py:696: in trading_index_intervals left = self._trading_index() exchange_calendars/calendar_helpers.py:632: in _trading_index index_am = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([1514856600000000000, 1514943000000000000, 1515029400000000000, 1515115800000000000, 1515375000000000000,...0000000, 1545269400000000000, 1545355800000000000, 1545874200000000000, 1545960600000000000], dtype=int64) end_nanos = array([1514865600000000000, 1514952000000000000, 1515038400000000000, 1515124800000000000, 1515384000000000000,...0000000, 1545278400000000000, 1545364800000000000, 1545883200000000000, 1545969600000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError ____________ TestTradingIndex.test_overlaps[ti_for_overlap0-False] _____________ self = ti_for_overlap = answers = {'24/7': , 'CMES': , 'XHKG': , 'XLON': , ...} def test_overlaps(self, ti_for_overlap, answers): """Test 'curtail_overlaps' and for overlaps against concrete parameters.""" ti = ti_for_overlap period = pd.Timedelta(ti.interval_nanos) period_106 = period == pd.Timedelta("106min") if period_106 or ti.closed == "both": with pytest.raises(errors.IndicesOverlapError): ti.trading_index() if ti.closed == "both": return if not ti.curtail_overlaps and period_106: # won't raise on "105min" as right side of last interval of am # session won't clash on coinciding with left side of first # interval of pm session as one of these sides will always be # open (in this case the left side). NB can't close on both # sides. with pytest.raises(errors.IntervalsOverlapError): ti.trading_index_intervals() else: > index = ti.trading_index_intervals() tests/test_calendar_helpers.py:1095: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ exchange_calendars/calendar_helpers.py:696: in trading_index_intervals left = self._trading_index() exchange_calendars/calendar_helpers.py:632: in _trading_index index_am = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([1514856600000000000, 1514943000000000000, 1515029400000000000, 1515115800000000000, 1515375000000000000,...0000000, 1545269400000000000, 1545355800000000000, 1545874200000000000, 1545960600000000000], dtype=int64) end_nanos = array([1514865600000000000, 1514952000000000000, 1515038400000000000, 1515124800000000000, 1515384000000000000,...0000000, 1545278400000000000, 1545364800000000000, 1545883200000000000, 1545969600000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________ TestTradingIndex.test_overlaps[ti_for_overlap2-True] _____________ self = ti_for_overlap = answers = {'24/7': , 'CMES': , 'XHKG': , 'XLON': , ...} def test_overlaps(self, ti_for_overlap, answers): """Test 'curtail_overlaps' and for overlaps against concrete parameters.""" ti = ti_for_overlap period = pd.Timedelta(ti.interval_nanos) period_106 = period == pd.Timedelta("106min") if period_106 or ti.closed == "both": with pytest.raises(errors.IndicesOverlapError): ti.trading_index() if ti.closed == "both": return if not ti.curtail_overlaps and period_106: # won't raise on "105min" as right side of last interval of am # session won't clash on coinciding with left side of first # interval of pm session as one of these sides will always be # open (in this case the left side). NB can't close on both # sides. with pytest.raises(errors.IntervalsOverlapError): ti.trading_index_intervals() else: > index = ti.trading_index_intervals() tests/test_calendar_helpers.py:1095: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ exchange_calendars/calendar_helpers.py:696: in trading_index_intervals left = self._trading_index() exchange_calendars/calendar_helpers.py:632: in _trading_index index_am = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([1514856600000000000, 1514943000000000000, 1515029400000000000, 1515115800000000000, 1515375000000000000,...0000000, 1545269400000000000, 1545355800000000000, 1545874200000000000, 1545960600000000000], dtype=int64) end_nanos = array([1514865600000000000, 1514952000000000000, 1515038400000000000, 1515124800000000000, 1515384000000000000,...0000000, 1545278400000000000, 1545364800000000000, 1545883200000000000, 1545969600000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError ____________ TestTradingIndex.test_overlaps[ti_for_overlap2-False] _____________ self = ti_for_overlap = answers = {'24/7': , 'CMES': , 'XHKG': , 'XLON': , ...} def test_overlaps(self, ti_for_overlap, answers): """Test 'curtail_overlaps' and for overlaps against concrete parameters.""" ti = ti_for_overlap period = pd.Timedelta(ti.interval_nanos) period_106 = period == pd.Timedelta("106min") if period_106 or ti.closed == "both": with pytest.raises(errors.IndicesOverlapError): ti.trading_index() if ti.closed == "both": return if not ti.curtail_overlaps and period_106: # won't raise on "105min" as right side of last interval of am # session won't clash on coinciding with left side of first # interval of pm session as one of these sides will always be # open (in this case the left side). NB can't close on both # sides. with pytest.raises(errors.IntervalsOverlapError): > ti.trading_index_intervals() tests/test_calendar_helpers.py:1093: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ exchange_calendars/calendar_helpers.py:696: in trading_index_intervals left = self._trading_index() exchange_calendars/calendar_helpers.py:632: in _trading_index index_am = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([1514856600000000000, 1514943000000000000, 1515029400000000000, 1515115800000000000, 1515375000000000000,...0000000, 1545269400000000000, 1545355800000000000, 1545874200000000000, 1545960600000000000], dtype=int64) end_nanos = array([1514865600000000000, 1514952000000000000, 1515038400000000000, 1515124800000000000, 1515384000000000000,...0000000, 1545278400000000000, 1545364800000000000, 1545883200000000000, 1545969600000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _________________ TestTradingIndex.test_overlaps_2[right-True] _________________ self = ti_for_overlap_error_negative_case = def test_overlaps_2(self, ti_for_overlap_error_negative_case): """Test for no overlaps against concrete edge case.""" ti = ti_for_overlap_error_negative_case > index = ti.trading_index() tests/test_calendar_helpers.py:1126: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([1514856600000000000, 1514943000000000000, 1515029400000000000, 1515115800000000000, 1515375000000000000,...0000000, 1545615000000000000, 1545874200000000000, 1545960600000000000, 1546219800000000000], dtype=int64) end_nanos = array([1514880000000000000, 1514966400000000000, 1515052800000000000, 1515139200000000000, 1515398400000000000,...0000000, 1545624000000000000, 1545897600000000000, 1545984000000000000, 1546228800000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError ________________ TestTradingIndex.test_overlaps_2[right-False] _________________ self = ti_for_overlap_error_negative_case = def test_overlaps_2(self, ti_for_overlap_error_negative_case): """Test for no overlaps against concrete edge case.""" ti = ti_for_overlap_error_negative_case > index = ti.trading_index() tests/test_calendar_helpers.py:1126: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([1514856600000000000, 1514943000000000000, 1515029400000000000, 1515115800000000000, 1515375000000000000,...0000000, 1545615000000000000, 1545874200000000000, 1545960600000000000, 1546219800000000000], dtype=int64) end_nanos = array([1514880000000000000, 1514966400000000000, 1515052800000000000, 1515139200000000000, 1515398400000000000,...0000000, 1545624000000000000, 1545897600000000000, 1545984000000000000, 1546228800000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _________________ TestTradingIndex.test_overlaps_2[both-True] __________________ self = ti_for_overlap_error_negative_case = def test_overlaps_2(self, ti_for_overlap_error_negative_case): """Test for no overlaps against concrete edge case.""" ti = ti_for_overlap_error_negative_case > index = ti.trading_index() tests/test_calendar_helpers.py:1126: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([1514856600000000000, 1514943000000000000, 1515029400000000000, 1515115800000000000, 1515375000000000000,...0000000, 1545615000000000000, 1545874200000000000, 1545960600000000000, 1546219800000000000], dtype=int64) end_nanos = array([1514880000000000000, 1514966400000000000, 1515052800000000000, 1515139200000000000, 1515398400000000000,...0000000, 1545624000000000000, 1545897600000000000, 1545984000000000000, 1546228800000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _________________ TestTradingIndex.test_overlaps_2[both-False] _________________ self = ti_for_overlap_error_negative_case = def test_overlaps_2(self, ti_for_overlap_error_negative_case): """Test for no overlaps against concrete edge case.""" ti = ti_for_overlap_error_negative_case > index = ti.trading_index() tests/test_calendar_helpers.py:1126: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([1514856600000000000, 1514943000000000000, 1515029400000000000, 1515115800000000000, 1515375000000000000,...0000000, 1545615000000000000, 1545874200000000000, 1545960600000000000, 1546219800000000000], dtype=int64) end_nanos = array([1514880000000000000, 1514966400000000000, 1515052800000000000, 1515139200000000000, 1515398400000000000,...0000000, 1545624000000000000, 1545897600000000000, 1545984000000000000, 1546228800000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _________________________ TestTradingIndex.test_force __________________________ self = cal_start_end = (, Timestamp('2018-01-01 00:00:00'), Timestamp('2018-12-31 00:00:00')) def test_force(self, cal_start_end): """Verify `force` option overrides `force_close` and `force_break_close`.""" cal, start, end = cal_start_end kwargs = dict(start=start, end=end, period="1h", intervals=True) > expected_true = cal.trading_index( **kwargs, force_close=True, force_break_close=True ) tests/test_calendar_helpers.py:1140: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ exchange_calendars/exchange_calendar.py:2710: in trading_index return _trading_index.trading_index_intervals() exchange_calendars/calendar_helpers.py:696: in trading_index_intervals left = self._trading_index() exchange_calendars/calendar_helpers.py:632: in _trading_index index_am = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([1514856600000000000, 1514943000000000000, 1515029400000000000, 1515115800000000000, 1515375000000000000,...0000000, 1545269400000000000, 1545355800000000000, 1545874200000000000, 1545960600000000000], dtype=int64) end_nanos = array([1514865600000000000, 1514952000000000000, 1515038400000000000, 1515124800000000000, 1515384000000000000,...0000000, 1545278400000000000, 1545364800000000000, 1545883200000000000, 1545969600000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestTradingIndex.test_ignore_breaks ______________________ self = cal_start_end = (, Timestamp('2018-01-01 00:00:00'), Timestamp('2018-12-31 00:00:00')) def test_ignore_breaks(self, cal_start_end): """Verify effect of ignore_breaks option.""" cal, start, end = cal_start_end assert cal.sessions_has_break(start, end) kwargs = dict(start=start, end=end, period="1h", intervals=True) # verify a difference > index_false = cal.trading_index(**kwargs, ignore_breaks=False) tests/test_calendar_helpers.py:1174: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ exchange_calendars/exchange_calendar.py:2710: in trading_index return _trading_index.trading_index_intervals() exchange_calendars/calendar_helpers.py:696: in trading_index_intervals left = self._trading_index() exchange_calendars/calendar_helpers.py:632: in _trading_index index_am = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([1514856600000000000, 1514943000000000000, 1515029400000000000, 1515115800000000000, 1515375000000000000,...0000000, 1545269400000000000, 1545355800000000000, 1545874200000000000, 1545960600000000000], dtype=int64) end_nanos = array([1514865600000000000, 1514952000000000000, 1515038400000000000, 1515124800000000000, 1515384000000000000,...0000000, 1545278400000000000, 1545364800000000000, 1545883200000000000, 1545969600000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _________________________ TestTradingIndex.test_align __________________________ self = cal_with_ans_align = (.TESTCal object at 0xb007b180>, ) dates_align = (Timestamp('2020-12-10 00:00:00'), Timestamp('2020-12-13 00:00:00')) one_min = Timedelta('0 days 00:01:00') @given( > data=st.data(), force_close=st.booleans(), force_break_close=st.booleans(), closed=st.sampled_from(["left", "right", "both", "neither"]), ignore_breaks=st.booleans(), ) tests/test_calendar_helpers.py:1232: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_calendar_helpers.py:1361: in test_align rtrn = cal.trading_index(*args, intervals=intervals, **kwargs) exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:632: in _trading_index index_am = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([1607587140000000000], dtype=int64) end_nanos = array([1607608680000000000], dtype=int64), force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' E Falsifying example: test_align( E self=, E cal_with_ans_align=(.TESTCal object at 0xb007b180>, E ), E dates_align=(Timestamp('2020-12-10 00:00:00'), E Timestamp('2020-12-13 00:00:00')), E one_min=Timedelta('0 days 00:01:00'), E data=data(...), E force_close=False, # or any other generated value E force_break_close=False, # or any other generated value E closed='left', # or any other generated value E ignore_breaks=False, # or any other generated value E ) E Draw 1: '-1min' E Draw 2: '-1min' E Draw 3: Timedelta('0 days 00:01:00') exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestTradingIndex.test_align_overlap ______________________ self = cal_with_ans_align = (.TESTCal object at 0xb007b180>, ) dates_align = (Timestamp('2020-12-10 00:00:00'), Timestamp('2020-12-13 00:00:00')) one_min = Timedelta('0 days 00:01:00') def test_align_overlap(self, cal_with_ans_align, dates_align, one_min): """Test align options can cause overlap error. Tests concrete case raises overlap errors due to alignment regardless that period is shorter than the break. """ cal, _ = cal_with_ans_align kwargs = dict(closed="right", align="-5min") align_pm = "-1h" intervals = True # assert returns at edge period = pd.Timedelta(85, "min") > rtrn = cal.trading_index( *dates_align, period, intervals=intervals, align_pm=align_pm, **kwargs ) tests/test_calendar_helpers.py:1392: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ exchange_calendars/exchange_calendar.py:2710: in trading_index return _trading_index.trading_index_intervals() exchange_calendars/calendar_helpers.py:696: in trading_index_intervals left = self._trading_index() exchange_calendars/calendar_helpers.py:632: in _trading_index index_am = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([1607586900000000000], dtype=int64) end_nanos = array([1607608680000000000], dtype=int64), force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError ____________________ TestTradingIndex.test_start_end_times _____________________ self = one_min = Timedelta('0 days 00:01:00') calendars = {'24/7': , 'CMES': , 'XLON': , ...} def test_start_end_times(self, one_min, calendars): """Test effect of passing start and/or end as a time. Tests passing start / end as combinations of dates and/or times. Tests by comparing return with subset of return for start and end as sessions. Tests return with `intervals` as True (IntervalIndex) and False (DatetimeIndex). With `intervals` as False tests for all `closed` options. """ cal = calendars["XHKG"] # Define a start session and end session as sessions of standard length start_s = pd.Timestamp("2021-12-06") end_s = pd.Timestamp("2021-12-20") # assert of standard length standard_length = pd.Timedelta(hours=6, minutes=30) start_s_open, start_s_close = cal.session_open_close(start_s) assert start_s_close - start_s_open == standard_length end_s_open, end_s_close = cal.session_open_close(end_s) assert end_s_close - end_s_open == standard_length f = cal.trading_index # Note: when intervals = False the return will include the indice coinciding # with `start` and `end` even if the period that indice represents falls, # respectively, before `start` or after `end` def assertions( starts: list[ tuple[ pd.Timestamp, int | None, int | None, int | None, int | None, int | None, ] ], ends: list[ tuple[ pd.Timestamp, int | None, int | None, int | None, int | None, int | None, ] ], period: pd.Timedelta | str, force: bool, ignore_breaks: bool, curtail_overlaps: bool = False, ): """Assert returns slice of return for sessions. Parameters ---------- starts: list of tuple (see method signature) of: [0] value to pass as start. Other items define the start of slice of subset when start is [0] and: [1] intervals is True. [2] intervals is False and 'closed' is "left". [3] intervals is False and 'closed' is "right". [4] intervals is False and 'closed' is "both". [5] intervals is False and 'closed' is "neither". ends: list of tuple (see method signature) of: [0] value to pass as end. Other items define the end of slice of subset when end is [0] and: [1] intervals is True. [2] intervals is False and 'closed' is "left". [3] intervals is False and 'closed' is "right". [4] intervals is False and 'closed' is "both". [5] intervals is False and 'closed' is "neither". All other parameters will be passed thorugh to `trading_index`. """ args_dates = (start_s, end_s, period) kwargs = dict( force=force, ignore_breaks=ignore_breaks, curtail_overlaps=curtail_overlaps, ) for (start, slc_start, ssl, ssr, ssb, ssn), ( end, slc_end, sel, ser, seb, sen, ) in itertools.product(starts, ends): args = (start, end, period) # verify for intervals index intervals = True index_dates = f(*args_dates, intervals, **kwargs) rtrn = f(*args, intervals=intervals, **kwargs) assert_index_equal(rtrn, index_dates[slc_start:slc_end]) # verify for datetime index intervals = False closed = "left" rtrn = f(*args, intervals=intervals, closed=closed, **kwargs) index_dates = f(*args_dates, intervals, closed=closed, **kwargs) assert_index_equal(rtrn, index_dates[ssl:sel]) closed = "right" rtrn = f(*args, intervals=intervals, closed=closed, **kwargs) index_dates = f(*args_dates, intervals, closed=closed, **kwargs) assert_index_equal(rtrn, index_dates[ssr:ser]) closed = "both" rtrn = f(*args, intervals=intervals, closed=closed, **kwargs) index_dates = f(*args_dates, intervals, closed=closed, **kwargs) assert_index_equal(rtrn, index_dates[ssb:seb]) closed = "neither" rtrn = f(*args, intervals=intervals, closed=closed, **kwargs) index_dates = f(*args_dates, intervals, closed=closed, **kwargs) assert_index_equal(rtrn, index_dates[ssn:sen]) force, ignore_breaks = False, True period = one_min delta = period * 22 starts = [ (start_s, None, None, None, None, None), (start_s_open, None, None, None, None, None), (start_s_open + delta, 22, 22, 21, 22, 21), (start_s_open + delta - one_min, 21, 21, 20, 21, 20), (start_s_open + delta + one_min, 23, 23, 22, 23, 22), ] ends = [ (end_s, None, None, None, None, None), (end_s_close, None, None, None, None, None), (end_s_close - delta, -22, -21, -22, -22, -21), (end_s_close - delta + one_min, -21, -20, -21, -21, -20), (end_s_close - delta - one_min, -23, -22, -23, -23, -22), ] > assertions(starts, ends, period, force, ignore_breaks) tests/test_calendar_helpers.py:1590: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_calendar_helpers.py:1544: in assertions index_dates = f(*args_dates, intervals, **kwargs) exchange_calendars/exchange_calendar.py:2710: in trading_index return _trading_index.trading_index_intervals() exchange_calendars/calendar_helpers.py:696: in trading_index_intervals left = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([1638754200000000000, 1638840600000000000, 1638927000000000000, 1639013400000000000, 1639099800000000000,...5400000000000, 1639531800000000000, 1639618200000000000, 1639704600000000000, 1639963800000000000], dtype=int64) end_nanos = array([1638777600000000000, 1638864000000000000, 1638950400000000000, 1639036800000000000, 1639123200000000000,...8800000000000, 1639555200000000000, 1639641600000000000, 1639728000000000000, 1639987200000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestCMESCalendar.test_trading_index ______________________ self = calendars = {'left': , 'right': } answers = {'left': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) tst_indices_index(both_index, "both", both_overlaps) > tst_indices_index(left_index, "left", False) tests/test_exchange_calendar.py:3907: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([920934000000000000, 921020400000000000, 921106800000000000], dtype=int64) end_nanos = array([921020400000000000, 921106800000000000, 921193200000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestIEPACalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([920941200000000000, 921027600000000000, 921114000000000000], dtype=int64) end_nanos = array([921020400000000000, 921106800000000000, 921193200000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError ____________________ TestWeekdayCalendar.test_trading_index ____________________ self = calendars = {'left': , 'right': } answers = {'left': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) tst_indices_index(both_index, "both", both_overlaps) > tst_indices_index(left_index, "left", False) tests/test_exchange_calendar.py:3907: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([1525219200000000000, 1525305600000000000, 1525392000000000000], dtype=int64) end_nanos = array([1525305600000000000, 1525392000000000000, 1525478400000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXAMSCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([946454400000000000, 946540800000000000, 946886400000000000], dtype=int64) end_nanos = array([946485000000000000, 946571400000000000, 946917000000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXASXCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([1000425600000000000, 1000684800000000000, 1000771200000000000], dtype=int64) end_nanos = array([1000447200000000000, 1000706400000000000, 1000792800000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXBKKCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([954471600000000000, 954730800000000000, 954817200000000000], dtype=int64) end_nanos = array([954495000000000000, 954754200000000000, 954840600000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXBOGCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([954167400000000000, 954253800000000000, 954340200000000000], dtype=int64) end_nanos = array([954190800000000000, 954277200000000000, 954363600000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXBOMCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([1144381500000000000, 1144640700000000000, 1144813500000000000], dtype=int64) end_nanos = array([1144404000000000000, 1144663200000000000, 1144836000000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXBRUCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([946368000000000000, 946454400000000000, 946540800000000000], dtype=int64) end_nanos = array([946398600000000000, 946485000000000000, 946571400000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXBSECalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([993020400000000000, 993106800000000000, 993193200000000000], dtype=int64) end_nanos = array([993048300000000000, 993134700000000000, 993221100000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXBUDCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([952934400000000000, 953020800000000000, 953193600000000000], dtype=int64) end_nanos = array([952963200000000000, 953049600000000000, 953222400000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXBUECalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([953647200000000000, 953733600000000000, 953820000000000000], dtype=int64) end_nanos = array([953668800000000000, 953755200000000000, 953841600000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXCBFCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([981556200000000000, 981642600000000000, 981729000000000000], dtype=int64) end_nanos = array([981580500000000000, 981666900000000000, 981753300000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXCSECalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([1000105200000000000, 1000191600000000000, 1000278000000000000], dtype=int64) end_nanos = array([1000134000000000000, 1000220400000000000, 1000306800000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXDUBCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([956732400000000000, 956818800000000000, 956905200000000000], dtype=int64) end_nanos = array([956762880000000000, 956849280000000000, 956935680000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXDUSCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([988264800000000000, 988351200000000000, 988610400000000000], dtype=int64) end_nanos = array([988315200000000000, 988401600000000000, 988660800000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXEEECalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([1003212000000000000, 1003298400000000000, 1003384800000000000], dtype=int64) end_nanos = array([1003248000000000000, 1003334400000000000, 1003420800000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXETRCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([982137600000000000, 982224000000000000, 982310400000000000], dtype=int64) end_nanos = array([982168200000000000, 982254600000000000, 982341000000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXFRACalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([988268400000000000, 988354800000000000, 988614000000000000], dtype=int64) end_nanos = array([988299000000000000, 988385400000000000, 988644600000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXHAMCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([988264800000000000, 988351200000000000, 988610400000000000], dtype=int64) end_nanos = array([988315200000000000, 988401600000000000, 988660800000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXHELCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([944553600000000000, 944640000000000000, 944726400000000000], dtype=int64) end_nanos = array([944584200000000000, 944670600000000000, 944757000000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXHKGCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:632: in _trading_index index_am = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([998964000000000000, 999050400000000000, 999136800000000000], dtype=int64) end_nanos = array([998971200000000000, 999057600000000000, 999144000000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXICECalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([1355995800000000000, 1356082200000000000, 1356600600000000000], dtype=int64) end_nanos = array([1356017400000000000, 1356103800000000000, 1356622200000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXIDXCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([947210400000000000, 947469600000000000, 947556000000000000], dtype=int64) end_nanos = array([947235000000000000, 947494200000000000, 947580600000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXISTCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([954140400000000000, 954226800000000000, 954313200000000000], dtype=int64) end_nanos = array([954169200000000000, 954255600000000000, 954342000000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXJSECalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([953794800000000000, 953881200000000000, 954140400000000000], dtype=int64) end_nanos = array([953823600000000000, 953910000000000000, 954169200000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXKARCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([949465920000000000, 949552320000000000, 949638720000000000], dtype=int64) end_nanos = array([949487400000000000, 949573800000000000, 949660200000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXKLSCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([952477200000000000, 952563600000000000, 952650000000000000], dtype=int64) end_nanos = array([952506000000000000, 952592400000000000, 952678800000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXKRXCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:632: in _trading_index index_am = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([872728200000000000, 872814600000000000, 872901000000000000], dtype=int64) end_nanos = array([872735400000000000, 872821800000000000, 872908200000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXLIMCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([954338400000000000, 954424800000000000, 954511200000000000], dtype=int64) end_nanos = array([954363600000000000, 954450000000000000, 954536400000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXLISCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([949478400000000000, 949564800000000000, 949651200000000000], dtype=int64) end_nanos = array([949509000000000000, 949595400000000000, 949681800000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXLONCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([985590000000000000, 985676400000000000, 985762800000000000], dtype=int64) end_nanos = array([985620600000000000, 985707000000000000, 985793400000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXMADCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([981446400000000000, 981532800000000000, 981619200000000000], dtype=int64) end_nanos = array([981477000000000000, 981563400000000000, 981649800000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXMEXCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([953044200000000000, 953130600000000000, 953217000000000000], dtype=int64) end_nanos = array([953067600000000000, 953154000000000000, 953240400000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXMILCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([943603200000000000, 943862400000000000, 943948800000000000], dtype=int64) end_nanos = array([943633800000000000, 943893000000000000, 943979400000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXMOSCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([997250400000000000, 997336800000000000, 997423200000000000], dtype=int64) end_nanos = array([997281900000000000, 997368300000000000, 997454700000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXNYSCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([977409000000000000, 977495400000000000, 977841000000000000], dtype=int64) end_nanos = array([977432400000000000, 977518800000000000, 977864400000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXNZECalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([986162400000000000, 986248800000000000, 986335200000000000], dtype=int64) end_nanos = array([986186700000000000, 986273100000000000, 986359500000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXOSLCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([944640000000000000, 944726400000000000, 944812800000000000], dtype=int64) end_nanos = array([944666400000000000, 944752800000000000, 944839200000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXPARCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([945676800000000000, 945763200000000000, 945849600000000000], dtype=int64) end_nanos = array([945707400000000000, 945793800000000000, 945880200000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXPHSCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([945307800000000000, 945394200000000000, 945653400000000000], dtype=int64) end_nanos = array([945329400000000000, 945415800000000000, 945675000000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXPRACalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([953712000000000000, 953798400000000000, 953884800000000000], dtype=int64) end_nanos = array([953738400000000000, 953824800000000000, 953911200000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXASUCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([1650870000000000000, 1650956400000000000, 1651042800000000000], dtype=int64) end_nanos = array([1650888000000000000, 1650974400000000000, 1651060800000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXSESCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([914202000000000000, 914288400000000000, 914374800000000000], dtype=int64) end_nanos = array([914230800000000000, 914317200000000000, 914403600000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXSGOCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([953127000000000000, 953213400000000000, 953299800000000000], dtype=int64) end_nanos = array([953150400000000000, 953236800000000000, 953323200000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXSHGCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:632: in _trading_index index_am = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([1015983000000000000, 1016069400000000000, 1016155800000000000], dtype=int64) end_nanos = array([1015990200000000000, 1016076600000000000, 1016163000000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXSTOCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([944726400000000000, 944812800000000000, 945072000000000000], dtype=int64) end_nanos = array([944757000000000000, 944843400000000000, 945102600000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestIXSWXCalendar.test_trading_index _____________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([943430400000000000, 943516800000000000, 943603200000000000], dtype=int64) end_nanos = array([943461000000000000, 943547400000000000, 943633800000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXTAECalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([1598857140000000000, 1598943540000000000, 1599029940000000000], dtype=int64) end_nanos = array([1598883300000000000, 1598969700000000000, 1599056100000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXTAICalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([985654800000000000, 985741200000000000, 985827600000000000], dtype=int64) end_nanos = array([985671000000000000, 985757400000000000, 985843800000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXTKSCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:632: in _trading_index index_am = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([1208736000000000000, 1208822400000000000, 1208908800000000000], dtype=int64) end_nanos = array([1208745000000000000, 1208831400000000000, 1208917800000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXTSECalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([943453800000000000, 943540200000000000, 943626600000000000], dtype=int64) end_nanos = array([943477200000000000, 943563600000000000, 943650000000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXWARCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([953193600000000000, 953280000000000000, 953539200000000000], dtype=int64) end_nanos = array([953222400000000000, 953308800000000000, 953568000000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError _____________________ TestXWBOCalendar.test_trading_index ______________________ self = calendars = {'both': , 'left': , 'right': } answers = {'both': , 'left': , 'neither': , 'right': } def test_trading_index(self, calendars, answers): """Test trading index with options as default values. Tests multitude of concrete cases covering product of all session blocks and various periods. Assumes default value (False) for each of `force_close`, `force_break_close` and `curtail_overlaps`. See test class `test_calendar_helpers.TestTradingIndex` for more comprehensive testing (including fuzz tests and parsing tests). """ cal, ans = calendars["left"], answers["left"] def unite(dtis: list[pd.DatetimeIndex]) -> pd.DatetimeIndex: return dtis[0].append(dtis[1:]) # append to not sort or remove duplicates for _, sessions in ans.session_block_generator(): for mins in [5, 17, 60, 123, 333, 1033]: period = pd.Timedelta(mins, "min") dtis = [] for session in sessions: indexes = ans.get_session_minutes(session) for i, index in enumerate(indexes): # Create closed 'both' trading index for each session/subsession if i == 0 and len(indexes) == 2: ends = ans.break_starts else: ends = ans.closes # index for a 'left' calendar, add end so evaluated as if 'both' index = index.append(pd.DatetimeIndex([ends[session]], tz=UTC)) index = index[::mins] # only want every period if not index[-1] == ends[session]: # if period doesn't coincide with end, add right side of # last interval which lies beyond end. last_indice = index[-1] + period index = index.append( pd.DatetimeIndex([last_indice], tz=UTC) ) dtis.append(index) both_index = unite(dtis) left_index = unite([dti[:-1] for dti in dtis]) right_index = unite([dti[1:] for dti in dtis]) neither_index = unite([dti[1:-1] for dti in dtis]) overlaps = (right_index[:-1] > left_index[1:]).any() if overlaps: both_overlaps = overlaps else: both_overlaps = False for dti, next_dti in zip(dtis, dtis[1:]): if dti[-1] == next_dti[0]: both_overlaps = True break def get_index(closed: str, intervals: bool): start, end = sessions[0], sessions[-1] return cal.trading_index( start, end, period, intervals, closed, parse=False ) def tst_indices_index( expected: pd.DatetimeIndex, closed: str, overlaps: bool ): if not overlaps: rtrn = get_index(closed, False) pd.testing.assert_index_equal(expected, rtrn) else: with pytest.raises(errors.IndicesOverlapError): get_index(closed, False) > tst_indices_index(both_index, "both", both_overlaps) tests/test_exchange_calendar.py:3906: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_exchange_calendar.py:3900: in tst_indices_index rtrn = get_index(closed, False) tests/test_exchange_calendar.py:3892: in get_index return cal.trading_index( exchange_calendars/exchange_calendar.py:2708: in trading_index return _trading_index.trading_index() exchange_calendars/calendar_helpers.py:677: in trading_index index = self._trading_index() exchange_calendars/calendar_helpers.py:651: in _trading_index index = self._create_index_for_sessions( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start_nanos = array([993625200000000000, 993711600000000000, 993798000000000000], dtype=int64) end_nanos = array([993655800000000000, 993742200000000000, 993828600000000000], dtype=int64) force_close = False def _create_index_for_sessions( self, start_nanos: np.ndarray, end_nanos: np.ndarray, force_close: bool, ) -> np.ndarray: """Create nano array of indices for sessions of given bounds.""" if start_nanos.size == 0: return start_nanos # evaluate number of indices for each session num_intervals = (end_nanos - start_nanos) / self.interval_nanos num_indices = np.ceil(num_intervals).astype("int64") if force_close: if self.closed_right: on_freq = (num_intervals == num_indices).all() if not on_freq: num_indices -= 1 # add the close later else: on_freq = True if self.closed == "both": num_indices += 1 elif self.closed == "neither": num_indices -= 1 # by session, evaluate a range of int such that indices of a session # could be evaluted from [ session_open + (freq * i) for i in range ] start = 0 if self.closed_left else 1 func = np.vectorize(lambda stop: np.arange(start, stop), otypes=[np.ndarray]) stop = num_indices if self.closed_left else num_indices + 1 ranges = np.concatenate(func(stop), axis=0, dtype=np.int64) # evaluate index as nano array > base = start_nanos.repeat(num_indices) E TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe' exchange_calendars/calendar_helpers.py:602: TypeError ============================= slowest 15 durations ============================= 151.68s call .pybuild/cpython3_3.12_exchange-calendars/build/tests/test_exchange_calendar.py::test_default_calendars 112.88s setup .pybuild/cpython3_3.12_exchange-calendars/build/tests/test_xkrx_calendar.py::TestXKRXCalendar::test_calculated_against_csv 90.91s call .pybuild/cpython3_3.12_exchange-calendars/build/tests/test_calendar_helpers.py::TestTradingIndex::test_intervals_fuzz[XHKG] 74.29s setup .pybuild/cpython3_3.12_exchange-calendars/build/tests/test_xmos_calendar.py::TestXMOSCalendar::test_calculated_against_csv 69.00s call .pybuild/cpython3_3.12_exchange-calendars/build/tests/test_calendar_helpers.py::TestTradingIndex::test_indices_fuzz[XHKG] 66.00s call .pybuild/cpython3_3.12_exchange-calendars/build/tests/test_calendar_helpers.py::TestTradingIndex::test_intervals_fuzz[XTAE] 60.29s call .pybuild/cpython3_3.12_exchange-calendars/build/tests/test_calendar_helpers.py::TestTradingIndex::test_intervals_fuzz[XLON] 60.19s call .pybuild/cpython3_3.12_exchange-calendars/build/tests/test_calendar_helpers.py::TestTradingIndex::test_indices_fuzz[XLON] 59.10s call .pybuild/cpython3_3.12_exchange-calendars/build/tests/test_calendar_helpers.py::TestTradingIndex::test_intervals_fuzz[24/7] 55.76s call .pybuild/cpython3_3.12_exchange-calendars/build/tests/test_calendar_helpers.py::TestTradingIndex::test_indices_fuzz[XTAE] 55.60s call .pybuild/cpython3_3.12_exchange-calendars/build/tests/test_calendar_helpers.py::TestTradingIndex::test_indices_fuzz[CMES] 54.10s call .pybuild/cpython3_3.12_exchange-calendars/build/tests/test_calendar_helpers.py::TestTradingIndex::test_indices_fuzz[24/7] 46.53s call .pybuild/cpython3_3.12_exchange-calendars/build/tests/test_calendar_helpers.py::TestTradingIndex::test_intervals_fuzz[CMES] 43.11s call .pybuild/cpython3_3.12_exchange-calendars/build/tests/test_xmos_calendar.py::TestXMOSCalendar::test_bound_min 38.60s call .pybuild/cpython3_3.12_exchange-calendars/build/tests/test_xkrx_calendar.py::TestXKRXCalendar::test_bound_min =========================== short test summary info ============================ FAILED tests/test_aixk_calendar.py::TestAIXKCalendar::test_trading_index - Ty... FAILED tests/test_always_open.py::TestAlwaysOpenCalendar::test_trading_index FAILED tests/test_asex_calendar.py::TestASEXCalendar::test_trading_index - Ty... FAILED tests/test_bvmf_calendar.py::TestBVMFCalendar::test_trading_index - Ty... FAILED tests/test_calendar_helpers.py::TestTradingIndex::test_indices_fuzz[XLON] FAILED tests/test_calendar_helpers.py::TestTradingIndex::test_intervals_fuzz[XLON] FAILED tests/test_calendar_helpers.py::TestTradingIndex::test_indices_fuzz[XHKG] FAILED tests/test_calendar_helpers.py::TestTradingIndex::test_intervals_fuzz[XHKG] FAILED tests/test_calendar_helpers.py::TestTradingIndex::test_indices_fuzz[XTAE] FAILED tests/test_calendar_helpers.py::TestTradingIndex::test_intervals_fuzz[XTAE] FAILED tests/test_calendar_helpers.py::TestTradingIndex::test_indices_fuzz[CMES] FAILED tests/test_calendar_helpers.py::TestTradingIndex::test_intervals_fuzz[CMES] FAILED tests/test_calendar_helpers.py::TestTradingIndex::test_indices_fuzz[24/7] FAILED tests/test_calendar_helpers.py::TestTradingIndex::test_intervals_fuzz[24/7] FAILED tests/test_calendar_helpers.py::TestTradingIndex::test_for_empty_with_neither_fuzz FAILED tests/test_calendar_helpers.py::TestTradingIndex::test_overlap_error_fuzz[XHKG] FAILED tests/test_calendar_helpers.py::TestTradingIndex::test_overlap_error_fuzz[24/7] FAILED tests/test_calendar_helpers.py::TestTradingIndex::test_overlap_error_fuzz[CMES] FAILED tests/test_calendar_helpers.py::TestTradingIndex::test_overlaps[ti_for_overlap0-True] FAILED tests/test_calendar_helpers.py::TestTradingIndex::test_overlaps[ti_for_overlap0-False] FAILED tests/test_calendar_helpers.py::TestTradingIndex::test_overlaps[ti_for_overlap2-True] FAILED tests/test_calendar_helpers.py::TestTradingIndex::test_overlaps[ti_for_overlap2-False] FAILED tests/test_calendar_helpers.py::TestTradingIndex::test_overlaps_2[right-True] FAILED tests/test_calendar_helpers.py::TestTradingIndex::test_overlaps_2[right-False] FAILED tests/test_calendar_helpers.py::TestTradingIndex::test_overlaps_2[both-True] FAILED tests/test_calendar_helpers.py::TestTradingIndex::test_overlaps_2[both-False] FAILED tests/test_calendar_helpers.py::TestTradingIndex::test_force - TypeErr... FAILED tests/test_calendar_helpers.py::TestTradingIndex::test_ignore_breaks FAILED tests/test_calendar_helpers.py::TestTradingIndex::test_align - TypeErr... FAILED tests/test_calendar_helpers.py::TestTradingIndex::test_align_overlap FAILED tests/test_calendar_helpers.py::TestTradingIndex::test_start_end_times FAILED tests/test_cmes_calendar.py::TestCMESCalendar::test_trading_index - Ty... FAILED tests/test_iepa_calendar.py::TestIEPACalendar::test_trading_index - Ty... FAILED tests/test_weekday_calendar.py::TestWeekdayCalendar::test_trading_index FAILED tests/test_xams_calendar.py::TestXAMSCalendar::test_trading_index - Ty... FAILED tests/test_xasx_calendar.py::TestXASXCalendar::test_trading_index - Ty... FAILED tests/test_xbkk_calendar.py::TestXBKKCalendar::test_trading_index - Ty... FAILED tests/test_xbog_calendar.py::TestXBOGCalendar::test_trading_index - Ty... FAILED tests/test_xbom_calendar.py::TestXBOMCalendar::test_trading_index - Ty... FAILED tests/test_xbru_calendar.py::TestXBRUCalendar::test_trading_index - Ty... FAILED tests/test_xbse_calendar.py::TestXBSECalendar::test_trading_index - Ty... FAILED tests/test_xbud_calendar.py::TestXBUDCalendar::test_trading_index - Ty... FAILED tests/test_xbue_calendar.py::TestXBUECalendar::test_trading_index - Ty... FAILED tests/test_xcbf_calendar.py::TestXCBFCalendar::test_trading_index - Ty... FAILED tests/test_xcse_calendar.py::TestXCSECalendar::test_trading_index - Ty... FAILED tests/test_xdub_calendar.py::TestXDUBCalendar::test_trading_index - Ty... FAILED tests/test_xdus_calendar.py::TestXDUSCalendar::test_trading_index - Ty... FAILED tests/test_xeee_calendar.py::TestXEEECalendar::test_trading_index - Ty... FAILED tests/test_xetr_calendar.py::TestXETRCalendar::test_trading_index - Ty... FAILED tests/test_xfra_calendar.py::TestXFRACalendar::test_trading_index - Ty... FAILED tests/test_xham_calendar.py::TestXHAMCalendar::test_trading_index - Ty... FAILED tests/test_xhel_calendar.py::TestXHELCalendar::test_trading_index - Ty... FAILED tests/test_xhkg_calendar.py::TestXHKGCalendar::test_trading_index - Ty... FAILED tests/test_xice_calendar.py::TestXICECalendar::test_trading_index - Ty... FAILED tests/test_xidx_calendar.py::TestXIDXCalendar::test_trading_index - Ty... FAILED tests/test_xist_calendar.py::TestXISTCalendar::test_trading_index - Ty... FAILED tests/test_xjse_calendar.py::TestXJSECalendar::test_trading_index - Ty... FAILED tests/test_xkar_calendar.py::TestXKARCalendar::test_trading_index - Ty... FAILED tests/test_xkls_calendar.py::TestXKLSCalendar::test_trading_index - Ty... FAILED tests/test_xkrx_calendar.py::TestXKRXCalendar::test_trading_index - Ty... FAILED tests/test_xlim_calendar.py::TestXLIMCalendar::test_trading_index - Ty... FAILED tests/test_xlis_calendar.py::TestXLISCalendar::test_trading_index - Ty... FAILED tests/test_xlon_calendar.py::TestXLONCalendar::test_trading_index - Ty... FAILED tests/test_xmad_calendar.py::TestXMADCalendar::test_trading_index - Ty... FAILED tests/test_xmex_calendar.py::TestXMEXCalendar::test_trading_index - Ty... FAILED tests/test_xmil_calendar.py::TestXMILCalendar::test_trading_index - Ty... FAILED tests/test_xmos_calendar.py::TestXMOSCalendar::test_trading_index - Ty... FAILED tests/test_xnys_calendar.py::TestXNYSCalendar::test_trading_index - Ty... FAILED tests/test_xnze_calendar.py::TestXNZECalendar::test_trading_index - Ty... FAILED tests/test_xosl_calendar.py::TestXOSLCalendar::test_trading_index - Ty... FAILED tests/test_xpar_calendar.py::TestXPARCalendar::test_trading_index - Ty... FAILED tests/test_xphs_calendar.py::TestXPHSCalendar::test_trading_index - Ty... FAILED tests/test_xpra_calendar.py::TestXPRACalendar::test_trading_index - Ty... FAILED tests/test_xsau_calendar.py::TestXASUCalendar::test_trading_index - Ty... FAILED tests/test_xses_calendar.py::TestXSESCalendar::test_trading_index - Ty... FAILED tests/test_xsgo_calendar.py::TestXSGOCalendar::test_trading_index - Ty... FAILED tests/test_xshg_calendar.py::TestXSHGCalendar::test_trading_index - Ty... FAILED tests/test_xsto_calendar.py::TestXSTOCalendar::test_trading_index - Ty... FAILED tests/test_xswx_calendar.py::TestIXSWXCalendar::test_trading_index - T... FAILED tests/test_xtae_calendar.py::TestXTAECalendar::test_trading_index - Ty... FAILED tests/test_xtai_calendar.py::TestXTAICalendar::test_trading_index - Ty... FAILED tests/test_xtks_calendar.py::TestXTKSCalendar::test_trading_index - Ty... FAILED tests/test_xtse_calendar.py::TestXTSECalendar::test_trading_index - Ty... FAILED tests/test_xwar_calendar.py::TestXWARCalendar::test_trading_index - Ty... FAILED tests/test_xwbo_calendar.py::TestXWBOCalendar::test_trading_index - Ty... =========== 85 failed, 8103 passed, 1 xfailed in 7142.37s (1:59:02) ============ E: pybuild pybuild:389: test: plugin pyproject failed with: exit code=1: cd /build/reproducible-path/exchange-calendars-4.5.5/.pybuild/cpython3_3.12_exchange-calendars/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: *** [debian/rules:6: binary] Error 25 dpkg-buildpackage: error: debian/rules binary subprocess returned exit status 2 I: copying local configuration E: Failed autobuilding of package 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/24692 and its subdirectories Sat Aug 3 05:23:11 UTC 2024 W: No second build log, what happened?