Sun Feb  9 06:36:40 UTC 2025  I: starting to build ruby-immutable-ruby/trixie/i386 on jenkins on '2025-02-09 06:36'
Sun Feb  9 06:36:40 UTC 2025  I: The jenkins build log is/was available at https://jenkins.debian.net/userContent/reproducible/debian/build_service/i386_7/56469/console.log
Sun Feb  9 06:36:40 UTC 2025  I: Downloading source for trixie/ruby-immutable-ruby=0.1.0-2
--2025-02-09 06:36:40--  http://deb.debian.org/debian/pool/main/r/ruby-immutable-ruby/ruby-immutable-ruby_0.1.0-2.dsc
Connecting to 46.16.76.132:3128... connected.
Proxy request sent, awaiting response... 200 OK
Length: 2161 (2.1K) [text/prs.lines.tag]
Saving to: ‘ruby-immutable-ruby_0.1.0-2.dsc’

     0K ..                                                    100%  291M=0s

2025-02-09 06:36:40 (291 MB/s) - ‘ruby-immutable-ruby_0.1.0-2.dsc’ saved [2161/2161]

Sun Feb  9 06:36:40 UTC 2025  I: ruby-immutable-ruby_0.1.0-2.dsc
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

Format: 3.0 (quilt)
Source: ruby-immutable-ruby
Binary: ruby-immutable-ruby
Architecture: all
Version: 0.1.0-2
Maintainer: Debian Ruby Team <pkg-ruby-extras-maintainers@lists.alioth.debian.org>
Uploaders: Cédric Boutillier <boutil@debian.org>
Homepage: https://github.com/immutable-ruby/immutable-ruby
Standards-Version: 4.6.1
Vcs-Browser: https://salsa.debian.org/ruby-team/ruby-immutable-ruby
Vcs-Git: https://salsa.debian.org/ruby-team/ruby-immutable-ruby.git
Testsuite: autopkgtest-pkg-ruby
Build-Depends: debhelper-compat (= 13), gem2deb (>= 1), ruby-concurrent (>= 1.1), ruby-rspec, ruby-sorted-set (>= 1.0)
Package-List:
 ruby-immutable-ruby deb ruby optional arch=all
Checksums-Sha1:
 7522a916561946ada35560ba5917e17dba8049a9 136552 ruby-immutable-ruby_0.1.0.orig.tar.gz
 01e0f3217058feb23d39fa8765c73f09c5af3e5d 2840 ruby-immutable-ruby_0.1.0-2.debian.tar.xz
Checksums-Sha256:
 07685756543e1053f800432f234c580d51953367eacc3080e671b66d62aaa575 136552 ruby-immutable-ruby_0.1.0.orig.tar.gz
 deb0d63c37da0ab2917aad848678b866ab08dea0923f6ba884dcc73b55ec9f57 2840 ruby-immutable-ruby_0.1.0-2.debian.tar.xz
Files:
 2c807712b49f58c7d5836db83a613c40 136552 ruby-immutable-ruby_0.1.0.orig.tar.gz
 1724ae52327a699333005440d1fe026f 2840 ruby-immutable-ruby_0.1.0-2.debian.tar.xz

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

iQIzBAEBCgAdFiEETQvhLw5HdtiqzpaW5mx3Wuv+bH0FAmUHXjIACgkQ5mx3Wuv+
bH1zoA//VxLI3ocaMFbr+jhbBwfkkDqYeLjjld+DHYs57P3JALJYuGVYUAIM5YXx
LT9dw77j0CqLmlSN2FqhiGqeRk5fbTYyeONJBDIGi47/wuY/VBPAyZr5nZSR1sNX
Ewimf+mBC1dZbdDfQp629ftZuWp+emUA6R+EuK2r1Yf8L/ivdUNqn4Qwgle7a9HJ
JywH5JGPIq+MDXmWf7SBA7PSvE8VDe+qTP/P41Q8WzycXwqS6SCnmci1OoHYmoTf
fB4FrTR2U6mSl2KVBmjLwK7pCVXkF1d4SDa8fsdY9ozMFYYf8NRSfy0nfwo4LENf
gQJ1JeqVNhl3tEYptH5Vvb1+jamUMUTTUTopzakTwc5JXne8fp24voMhW9n4UJxm
LwIt1issBjObMU4I6O590wGVPSQ4rfvrZUN9xM2TfqeM9AcLFlOawLJteGvSv6Wo
Jmu0S1oC4pxhm4+SVW40mmlM0B3zHN9nMqrVYxBb9xZ4DMLNeaD/hpHF7xgOUO3+
4nvLspHJYhCu8SCxJwwcAhNmFhFyNrsW+CE95Bl3EI+btjvl+ayf6V1GUiyM4FIP
YazTyLNoSmPaaMpIJeMQKUyPGhXtiqJ6oiLCqjV5/0yzcUhvGUcnGCX+AqI5W/qH
5g1CZG4QzS9Aje4hQ7oe4w2sS+sIfE+XJ0flyUOUJ3O/IB9xhqI=
=gbkK
-----END PGP SIGNATURE-----
Sun Feb  9 06:36:40 UTC 2025  I: Checking whether the package is not for us
Sun Feb  9 06:36:40 UTC 2025  I: Starting 1st build on remote node ionos12-i386.debian.net.
Sun Feb  9 06:36:40 UTC 2025  I: Preparing to do remote build '1' on ionos12-i386.debian.net.
Sun Feb  9 06:38:34 UTC 2025  I: Deleting $TMPDIR on ionos12-i386.debian.net.
I: pbuilder: network access will be disabled during build
I: Current time: Sat Feb  8 18:36:42 -12 2025
I: pbuilder-time-stamp: 1739083002
I: Building the build Environment
I: extracting base tarball [/var/cache/pbuilder/trixie-reproducible-base.tgz]
I: copying local configuration
W: --override-config is not set; not updating apt.conf Read the manpage for details.
I: mounting /proc filesystem
I: mounting /sys filesystem
I: creating /{dev,run}/shm
I: mounting /dev/pts filesystem
I: redirecting /dev/ptmx to /dev/pts/ptmx
I: policy-rc.d already exists
I: using eatmydata during job
I: Copying source file
I: copying [ruby-immutable-ruby_0.1.0-2.dsc]
I: copying [./ruby-immutable-ruby_0.1.0.orig.tar.gz]
I: copying [./ruby-immutable-ruby_0.1.0-2.debian.tar.xz]
I: Extracting source
dpkg-source: warning: cannot verify inline signature for ./ruby-immutable-ruby_0.1.0-2.dsc: unsupported subcommand
dpkg-source: info: extracting ruby-immutable-ruby in ruby-immutable-ruby-0.1.0
dpkg-source: info: unpacking ruby-immutable-ruby_0.1.0.orig.tar.gz
dpkg-source: info: unpacking ruby-immutable-ruby_0.1.0-2.debian.tar.xz
dpkg-source: info: using patch list from debian/patches/series
dpkg-source: info: applying no-pry-in-specs.patch
I: Not using root during the build.
I: Installing the build-deps
I: user script /srv/workspace/pbuilder/14570/tmp/hooks/D02_print_environment starting
I: set
  BUILDDIR='/build/reproducible-path'
  BUILDUSERGECOS='first user,first room,first work-phone,first home-phone,first other'
  BUILDUSERNAME='pbuilder1'
  BUILD_ARCH='i386'
  DEBIAN_FRONTEND='noninteractive'
  DEB_BUILD_OPTIONS='buildinfo=+all reproducible=+all parallel=11 '
  DISTRIBUTION='trixie'
  HOME='/root'
  HOST_ARCH='i386'
  IFS=' 	
  '
  INVOCATION_ID='4a49ccda4d1a4260a1203c3942527da8'
  LANG='C'
  LANGUAGE='en_US:en'
  LC_ALL='C'
  LD_LIBRARY_PATH='/usr/lib/libeatmydata'
  LD_PRELOAD='libeatmydata.so'
  MAIL='/var/mail/root'
  OPTIND='1'
  PATH='/usr/sbin:/usr/bin:/sbin:/bin:/usr/games'
  PBCURRENTCOMMANDLINEOPERATION='build'
  PBUILDER_OPERATION='build'
  PBUILDER_PKGDATADIR='/usr/share/pbuilder'
  PBUILDER_PKGLIBDIR='/usr/lib/pbuilder'
  PBUILDER_SYSCONFDIR='/etc'
  PPID='14570'
  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.sj0KDSdd/pbuilderrc_F8Hn --distribution trixie --hookdir /etc/pbuilder/first-build-hooks --debbuildopts -b --basetgz /var/cache/pbuilder/trixie-reproducible-base.tgz --buildresult /srv/reproducible-results/rbuild-debian/r-b-build.sj0KDSdd/b1 --logfile b1/build.log ruby-immutable-ruby_0.1.0-2.dsc'
  SUDO_GID='112'
  SUDO_UID='107'
  SUDO_USER='jenkins'
  TERM='unknown'
  TZ='/usr/share/zoneinfo/Etc/GMT+12'
  USER='root'
  _='/usr/bin/systemd-run'
  http_proxy='http://46.16.76.132:3128'
I: uname -a
  Linux ionos12-i386 6.1.0-30-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.124-1 (2025-01-12) x86_64 GNU/Linux
I: ls -l /bin
  lrwxrwxrwx 1 root root 7 Nov 22 14:40 /bin -> usr/bin
I: user script /srv/workspace/pbuilder/14570/tmp/hooks/D02_print_environment finished
 -> Attempting to satisfy build-dependencies
 -> Creating pbuilder-satisfydepends-dummy package
Package: pbuilder-satisfydepends-dummy
Version: 0.invalid.0
Architecture: i386
Maintainer: Debian Pbuilder Team <pbuilder-maint@lists.alioth.debian.org>
Description: Dummy package to satisfy dependencies with aptitude - created by pbuilder
 This package was created automatically by pbuilder to satisfy the
 build-dependencies of the package being currently built.
Depends: debhelper-compat (= 13), gem2deb (>= 1), ruby-concurrent (>= 1.1), ruby-rspec, ruby-sorted-set (>= 1.0)
dpkg-deb: building package 'pbuilder-satisfydepends-dummy' in '/tmp/satisfydepends-aptitude/pbuilder-satisfydepends-dummy.deb'.
Selecting previously unselected package pbuilder-satisfydepends-dummy.
(Reading database ... 19828 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 gem2deb (>= 1); however:
  Package gem2deb is not installed.
 pbuilder-satisfydepends-dummy depends on ruby-concurrent (>= 1.1); however:
  Package ruby-concurrent is not installed.
 pbuilder-satisfydepends-dummy depends on ruby-rspec; however:
  Package ruby-rspec is not installed.
 pbuilder-satisfydepends-dummy depends on ruby-sorted-set (>= 1.0); however:
  Package ruby-sorted-set is not installed.

Setting up pbuilder-satisfydepends-dummy (0.invalid.0) ...
Reading package lists...
Building dependency tree...
Reading state information...
Initializing package states...
Writing extended state information...
Building tag database...
pbuilder-satisfydepends-dummy is already installed at the requested version (0.invalid.0)
pbuilder-satisfydepends-dummy is already installed at the requested version (0.invalid.0)
The following NEW packages will be installed:
  autoconf{a} automake{a} autopoint{a} autotools-dev{a} bsdextrautils{a} ca-certificates{a} debhelper{a} devscripts{a} dh-autoreconf{a} dh-strip-nondeterminism{a} dirmngr{a} dwz{a} file{a} gem2deb{a} gem2deb-test-runner{a} gettext{a} gettext-base{a} gnupg{a} gnupg-l10n{a} gpg{a} gpg-agent{a} gpgconf{a} gpgsm{a} gpgv{a} groff-base{a} intltool-debian{a} libarchive-zip-perl{a} libassuan9{a} libb-hooks-op-check-perl{a} libclass-method-modifiers-perl{a} libclass-xsaccessor-perl{a} libclone-perl{a} libdebhelper-perl{a} libdevel-callchecker-perl{a} libdynaloader-functions-perl{a} libedit2{a} libelf1t64{a} libencode-locale-perl{a} libexpat1{a} libffi8{a} libfile-dirlist-perl{a} libfile-homedir-perl{a} libfile-listing-perl{a} libfile-stripnondeterminism-perl{a} libfile-touch-perl{a} libfile-which-perl{a} libgcrypt20{a} libgmp-dev{a} libgmpxx4ldbl{a} libgnutls30t64{a} libgpg-error0{a} libhtml-parser-perl{a} libhtml-tagset-perl{a} libhtml-tree-perl{a} libhttp-cookies-perl{a} libhttp-date-perl{a} libhttp-message-perl{a} libhttp-negotiate-perl{a} libicu72{a} libidn2-0{a} libimport-into-perl{a} libio-html-perl{a} libio-pty-perl{a} libio-socket-ssl-perl{a} libipc-run-perl{a} libksba8{a} libldap2{a} liblwp-mediatypes-perl{a} liblwp-protocol-https-perl{a} libmagic-mgc{a} libmagic1t64{a} libmodule-runtime-perl{a} libmoo-perl{a} libncurses6{a} libnet-http-perl{a} libnet-ssleay-perl{a} libnpth0t64{a} libp11-kit0{a} libparams-classify-perl{a} libpipeline1{a} libpython3-stdlib{a} libpython3.13-minimal{a} libpython3.13-stdlib{a} libreadline8t64{a} librole-tiny-perl{a} libruby{a} libruby3.1t64{a} libruby3.3{a} libsasl2-2{a} libsasl2-modules-db{a} libsub-quote-perl{a} libtasn1-6{a} libtimedate-perl{a} libtool{a} libtry-tiny-perl{a} libuchardet0{a} libunistring5{a} liburi-perl{a} libwww-perl{a} libwww-robotrules-perl{a} libxml2{a} libyaml-0-2{a} m4{a} man-db{a} media-types{a} netbase{a} openssl{a} patchutils{a} perl-openssl-defaults{a} pinentry-curses{a} po-debconf{a} python3{a} python3-minimal{a} python3.13{a} python3.13-minimal{a} rake{a} readline-common{a} ruby{a} ruby-all-dev{a} ruby-concurrent{a} ruby-diff-lcs{a} ruby-net-telnet{a} ruby-rbtree{a} ruby-rspec{a} ruby-rspec-core{a} ruby-rspec-expectations{a} ruby-rspec-mocks{a} ruby-rspec-support{a} ruby-rubygems{a} ruby-sdbm{a} ruby-sorted-set{a} ruby-webrick{a} ruby-xmlrpc{a} ruby3.1{a} ruby3.1-dev{a} ruby3.3{a} ruby3.3-dev{a} rubygems-integration{a} sensible-utils{a} sopv-gpgv{a} tzdata{a} wdiff{a} 
The following packages are RECOMMENDED but will NOT be installed:
  apt-file curl dctrl-tools debian-keyring dput dput-ng dupload equivs fonts-lato gnupg-utils gpg-wks-client libarchive-cpio-perl libdata-dump-perl libdistro-info-perl libgit-wrapper-perl libgitlab-api-v4-perl libgpg-error-l10n libgpm2 libhtml-form-perl libhtml-format-perl libhttp-daemon-perl libio-compress-brotli-perl libjs-jquery libjson-perl libldap-common liblist-compare-perl libltdl-dev libmail-sendmail-perl libmailtools-perl libnamespace-clean-perl libsasl2-modules libsoap-lite-perl libstring-shellquote-perl libxstring-perl licensecheck lintian lynx pristine-tar python3-apt python3-argcomplete python3-debian python3-magic python3-requests python3-unidiff python3-xdg ruby3.1-doc ruby3.3-doc strace unzip wget zip 
0 packages upgraded, 142 newly installed, 0 to remove and 0 not upgraded.
Need to get 56.7 MB of archives. After unpacking 209 MB will be used.
Writing extended state information...
Get: 1 http://deb.debian.org/debian trixie/main i386 libpython3.13-minimal i386 3.13.1-3+b1 [858 kB]
Get: 2 http://deb.debian.org/debian trixie/main i386 libexpat1 i386 2.6.4-1 [107 kB]
Get: 3 http://deb.debian.org/debian trixie/main i386 python3.13-minimal i386 3.13.1-3+b1 [2244 kB]
Get: 4 http://deb.debian.org/debian trixie/main i386 python3-minimal i386 3.13.1-2 [27.0 kB]
Get: 5 http://deb.debian.org/debian trixie/main i386 media-types all 10.1.0 [26.9 kB]
Get: 6 http://deb.debian.org/debian trixie/main i386 netbase all 6.4 [12.8 kB]
Get: 7 http://deb.debian.org/debian trixie/main i386 tzdata all 2024b-6 [257 kB]
Get: 8 http://deb.debian.org/debian trixie/main i386 libffi8 i386 3.4.6-1 [21.2 kB]
Get: 9 http://deb.debian.org/debian trixie/main i386 readline-common all 8.2-6 [69.4 kB]
Get: 10 http://deb.debian.org/debian trixie/main i386 libreadline8t64 i386 8.2-6 [173 kB]
Get: 11 http://deb.debian.org/debian trixie/main i386 libpython3.13-stdlib i386 3.13.1-3+b1 [1981 kB]
Get: 12 http://deb.debian.org/debian trixie/main i386 python3.13 i386 3.13.1-3+b1 [740 kB]
Get: 13 http://deb.debian.org/debian trixie/main i386 libpython3-stdlib i386 3.13.1-2 [9952 B]
Get: 14 http://deb.debian.org/debian trixie/main i386 python3 i386 3.13.1-2 [28.0 kB]
Get: 15 http://deb.debian.org/debian trixie/main i386 sensible-utils all 0.0.24 [24.8 kB]
Get: 16 http://deb.debian.org/debian trixie/main i386 openssl i386 3.4.0-2 [1427 kB]
Get: 17 http://deb.debian.org/debian trixie/main i386 ca-certificates all 20241223 [164 kB]
Get: 18 http://deb.debian.org/debian trixie/main i386 libmagic-mgc i386 1:5.45-3+b1 [314 kB]
Get: 19 http://deb.debian.org/debian trixie/main i386 libmagic1t64 i386 1:5.45-3+b1 [115 kB]
Get: 20 http://deb.debian.org/debian trixie/main i386 file i386 1:5.45-3+b1 [43.2 kB]
Get: 21 http://deb.debian.org/debian trixie/main i386 gettext-base i386 0.23.1-1 [245 kB]
Get: 22 http://deb.debian.org/debian trixie/main i386 libuchardet0 i386 0.0.8-1+b2 [69.2 kB]
Get: 23 http://deb.debian.org/debian trixie/main i386 groff-base i386 1.23.0-7 [1199 kB]
Get: 24 http://deb.debian.org/debian trixie/main i386 bsdextrautils i386 2.40.4-2 [96.1 kB]
Get: 25 http://deb.debian.org/debian trixie/main i386 libpipeline1 i386 1.5.8-1 [41.2 kB]
Get: 26 http://deb.debian.org/debian trixie/main i386 man-db i386 2.13.0-1 [1428 kB]
Get: 27 http://deb.debian.org/debian trixie/main i386 m4 i386 1.4.19-5 [301 kB]
Get: 28 http://deb.debian.org/debian trixie/main i386 autoconf all 2.72-3 [493 kB]
Get: 29 http://deb.debian.org/debian trixie/main i386 autotools-dev all 20220109.1 [51.6 kB]
Get: 30 http://deb.debian.org/debian trixie/main i386 automake all 1:1.17-3 [862 kB]
Get: 31 http://deb.debian.org/debian trixie/main i386 autopoint all 0.23.1-1 [770 kB]
Get: 32 http://deb.debian.org/debian trixie/main i386 libdebhelper-perl all 13.24.1 [90.9 kB]
Get: 33 http://deb.debian.org/debian trixie/main i386 libtool all 2.5.4-3 [539 kB]
Get: 34 http://deb.debian.org/debian trixie/main i386 dh-autoreconf all 20 [17.1 kB]
Get: 35 http://deb.debian.org/debian trixie/main i386 libarchive-zip-perl all 1.68-1 [104 kB]
Get: 36 http://deb.debian.org/debian trixie/main i386 libfile-stripnondeterminism-perl all 1.14.1-1 [19.6 kB]
Get: 37 http://deb.debian.org/debian trixie/main i386 dh-strip-nondeterminism all 1.14.1-1 [8584 B]
Get: 38 http://deb.debian.org/debian trixie/main i386 libelf1t64 i386 0.192-4 [195 kB]
Get: 39 http://deb.debian.org/debian trixie/main i386 dwz i386 0.15-1+b1 [116 kB]
Get: 40 http://deb.debian.org/debian trixie/main i386 libunistring5 i386 1.3-1 [458 kB]
Get: 41 http://deb.debian.org/debian trixie/main i386 libicu72 i386 72.1-6 [9582 kB]
Get: 42 http://deb.debian.org/debian trixie/main i386 libxml2 i386 2.12.7+dfsg+really2.9.14-0.2+b1 [734 kB]
Get: 43 http://deb.debian.org/debian trixie/main i386 gettext i386 0.23.1-1 [1714 kB]
Get: 44 http://deb.debian.org/debian trixie/main i386 intltool-debian all 0.35.0+20060710.6 [22.9 kB]
Get: 45 http://deb.debian.org/debian trixie/main i386 po-debconf all 1.0.21+nmu1 [248 kB]
Get: 46 http://deb.debian.org/debian trixie/main i386 debhelper all 13.24.1 [920 kB]
Get: 47 http://deb.debian.org/debian trixie/main i386 libgpg-error0 i386 1.51-3 [87.3 kB]
Get: 48 http://deb.debian.org/debian trixie/main i386 libassuan9 i386 3.0.1-2 [62.4 kB]
Get: 49 http://deb.debian.org/debian trixie/main i386 libgcrypt20 i386 1.11.0-7 [799 kB]
Get: 50 http://deb.debian.org/debian trixie/main i386 gpgconf i386 2.2.46-1+b1 [128 kB]
Get: 51 http://deb.debian.org/debian trixie/main i386 libidn2-0 i386 2.3.7-2+b1 [130 kB]
Get: 52 http://deb.debian.org/debian trixie/main i386 libp11-kit0 i386 0.25.5-3 [423 kB]
Get: 53 http://deb.debian.org/debian trixie/main i386 libtasn1-6 i386 4.19.0-3+b3 [51.1 kB]
Get: 54 http://deb.debian.org/debian trixie/main i386 libgnutls30t64 i386 3.8.8-2 [1451 kB]
Get: 55 http://deb.debian.org/debian trixie/main i386 libksba8 i386 1.6.7-2+b1 [142 kB]
Get: 56 http://deb.debian.org/debian trixie/main i386 libsasl2-modules-db i386 2.1.28+dfsg1-8+b1 [20.9 kB]
Get: 57 http://deb.debian.org/debian trixie/main i386 libsasl2-2 i386 2.1.28+dfsg1-8+b1 [61.3 kB]
Get: 58 http://deb.debian.org/debian trixie/main i386 libldap2 i386 2.6.9+dfsg-1 [205 kB]
Get: 59 http://deb.debian.org/debian trixie/main i386 libnpth0t64 i386 1.8-2 [23.0 kB]
Get: 60 http://deb.debian.org/debian trixie/main i386 dirmngr i386 2.2.46-1+b1 [396 kB]
Get: 61 http://deb.debian.org/debian trixie/main i386 gnupg-l10n all 2.2.46-1 [702 kB]
Get: 62 http://deb.debian.org/debian trixie/main i386 gpg i386 2.2.46-1+b1 [574 kB]
Get: 63 http://deb.debian.org/debian trixie/main i386 pinentry-curses i386 1.3.1-2 [88.0 kB]
Get: 64 http://deb.debian.org/debian trixie/main i386 gpg-agent i386 2.2.46-1+b1 [270 kB]
Get: 65 http://deb.debian.org/debian trixie/main i386 gpgsm i386 2.2.46-1+b1 [276 kB]
Get: 66 http://deb.debian.org/debian trixie/main i386 gnupg all 2.2.46-1 [376 kB]
Get: 67 http://deb.debian.org/debian trixie/main i386 gpgv i386 2.2.46-1+b1 [240 kB]
Get: 68 http://deb.debian.org/debian trixie/main i386 sopv-gpgv all 0.1.1-1 [10.7 kB]
Get: 69 http://deb.debian.org/debian trixie/main i386 libfile-dirlist-perl all 0.05-3 [7600 B]
Get: 70 http://deb.debian.org/debian trixie/main i386 libfile-which-perl all 1.27-2 [15.1 kB]
Get: 71 http://deb.debian.org/debian trixie/main i386 libfile-homedir-perl all 1.006-2 [42.4 kB]
Get: 72 http://deb.debian.org/debian trixie/main i386 libfile-touch-perl all 0.12-2 [8816 B]
Get: 73 http://deb.debian.org/debian trixie/main i386 libio-pty-perl i386 1:1.20-1+b3 [35.8 kB]
Get: 74 http://deb.debian.org/debian trixie/main i386 libipc-run-perl all 20231003.0-2 [101 kB]
Get: 75 http://deb.debian.org/debian trixie/main i386 libclass-method-modifiers-perl all 2.15-1 [18.0 kB]
Get: 76 http://deb.debian.org/debian trixie/main i386 libclass-xsaccessor-perl i386 1.19-4+b4 [37.5 kB]
Get: 77 http://deb.debian.org/debian trixie/main i386 libb-hooks-op-check-perl i386 0.22-3+b2 [10.7 kB]
Get: 78 http://deb.debian.org/debian trixie/main i386 libdynaloader-functions-perl all 0.004-1 [12.1 kB]
Get: 79 http://deb.debian.org/debian trixie/main i386 libdevel-callchecker-perl i386 0.009-1+b1 [16.2 kB]
Get: 80 http://deb.debian.org/debian trixie/main i386 libparams-classify-perl i386 0.015-2+b4 [23.1 kB]
Get: 81 http://deb.debian.org/debian trixie/main i386 libmodule-runtime-perl all 0.016-2 [19.6 kB]
Get: 82 http://deb.debian.org/debian trixie/main i386 libimport-into-perl all 1.002005-2 [11.3 kB]
Get: 83 http://deb.debian.org/debian trixie/main i386 librole-tiny-perl all 2.002004-1 [21.4 kB]
Get: 84 http://deb.debian.org/debian trixie/main i386 libsub-quote-perl all 2.006008-1 [21.8 kB]
Get: 85 http://deb.debian.org/debian trixie/main i386 libmoo-perl all 2.005005-1 [58.0 kB]
Get: 86 http://deb.debian.org/debian trixie/main i386 libencode-locale-perl all 1.05-3 [12.9 kB]
Get: 87 http://deb.debian.org/debian trixie/main i386 libtimedate-perl all 2.3300-2 [39.3 kB]
Get: 88 http://deb.debian.org/debian trixie/main i386 libhttp-date-perl all 6.06-1 [10.7 kB]
Get: 89 http://deb.debian.org/debian trixie/main i386 libfile-listing-perl all 6.16-1 [12.4 kB]
Get: 90 http://deb.debian.org/debian trixie/main i386 libhtml-tagset-perl all 3.24-1 [14.7 kB]
Get: 91 http://deb.debian.org/debian trixie/main i386 liburi-perl all 5.30-1 [105 kB]
Get: 92 http://deb.debian.org/debian trixie/main i386 libhtml-parser-perl i386 3.83-1+b2 [101 kB]
Get: 93 http://deb.debian.org/debian trixie/main i386 libhtml-tree-perl all 5.07-3 [211 kB]
Get: 94 http://deb.debian.org/debian trixie/main i386 libclone-perl i386 0.47-1+b1 [14.0 kB]
Get: 95 http://deb.debian.org/debian trixie/main i386 libio-html-perl all 1.004-3 [16.2 kB]
Get: 96 http://deb.debian.org/debian trixie/main i386 liblwp-mediatypes-perl all 6.04-2 [20.2 kB]
Get: 97 http://deb.debian.org/debian trixie/main i386 libhttp-message-perl all 7.00-2 [79.8 kB]
Get: 98 http://deb.debian.org/debian trixie/main i386 libhttp-cookies-perl all 6.11-1 [19.1 kB]
Get: 99 http://deb.debian.org/debian trixie/main i386 libhttp-negotiate-perl all 6.01-2 [13.1 kB]
Get: 100 http://deb.debian.org/debian trixie/main i386 perl-openssl-defaults i386 7+b2 [6720 B]
Get: 101 http://deb.debian.org/debian trixie/main i386 libnet-ssleay-perl i386 1.94-2 [340 kB]
Get: 102 http://deb.debian.org/debian trixie/main i386 libio-socket-ssl-perl all 2.089-1 [223 kB]
Get: 103 http://deb.debian.org/debian trixie/main i386 libnet-http-perl all 6.23-1 [23.9 kB]
Get: 104 http://deb.debian.org/debian trixie/main i386 liblwp-protocol-https-perl all 6.14-1 [10.8 kB]
Get: 105 http://deb.debian.org/debian trixie/main i386 libtry-tiny-perl all 0.32-1 [22.9 kB]
Get: 106 http://deb.debian.org/debian trixie/main i386 libwww-robotrules-perl all 6.02-1 [12.9 kB]
Get: 107 http://deb.debian.org/debian trixie/main i386 libwww-perl all 6.77-1 [183 kB]
Get: 108 http://deb.debian.org/debian trixie/main i386 patchutils i386 0.4.2-1 [79.6 kB]
Get: 109 http://deb.debian.org/debian trixie/main i386 wdiff i386 1.2.2-7 [123 kB]
Get: 110 http://deb.debian.org/debian trixie/main i386 devscripts all 2.25.2 [1058 kB]
Get: 111 http://deb.debian.org/debian trixie/main i386 rubygems-integration all 1.19 [5488 B]
Get: 112 http://deb.debian.org/debian trixie/main i386 ruby-net-telnet all 0.2.0-1 [13.1 kB]
Get: 113 http://deb.debian.org/debian trixie/main i386 ruby-webrick all 1.8.1-1 [51.4 kB]
Get: 114 http://deb.debian.org/debian trixie/main i386 ruby-xmlrpc all 0.3.3-2 [24.4 kB]
Get: 115 http://deb.debian.org/debian trixie/main i386 libyaml-0-2 i386 0.2.5-2 [55.8 kB]
Get: 116 http://deb.debian.org/debian trixie/main i386 libruby3.3 i386 3.3.7-1 [6385 kB]
Get: 117 http://deb.debian.org/debian trixie/main i386 libruby i386 1:3.1+support3.3 [4888 B]
Get: 118 http://deb.debian.org/debian trixie/main i386 ruby-sdbm i386 1.0.0-5+b6 [20.3 kB]
Get: 119 http://deb.debian.org/debian trixie/main i386 libedit2 i386 3.1-20250104-1 [98.1 kB]
Get: 120 http://deb.debian.org/debian trixie/main i386 libncurses6 i386 6.5-2+b1 [112 kB]
Get: 121 http://deb.debian.org/debian trixie/main i386 libruby3.1t64 i386 3.1.2-8.5 [5470 kB]
Get: 122 http://deb.debian.org/debian trixie/main i386 ruby3.1 i386 3.1.2-8.5 [664 kB]
Get: 123 http://deb.debian.org/debian trixie/main i386 ruby-rubygems all 3.6.3-1 [406 kB]
Get: 124 http://deb.debian.org/debian trixie/main i386 ruby i386 1:3.1+support3.3 [5944 B]
Get: 125 http://deb.debian.org/debian trixie/main i386 rake all 13.2.1-1 [65.2 kB]
Get: 126 http://deb.debian.org/debian trixie/main i386 gem2deb-test-runner i386 2.2.5 [17.9 kB]
Get: 127 http://deb.debian.org/debian trixie/main i386 libgmpxx4ldbl i386 2:6.3.0+dfsg-3 [329 kB]
Get: 128 http://deb.debian.org/debian trixie/main i386 libgmp-dev i386 2:6.3.0+dfsg-3 [661 kB]
Get: 129 http://deb.debian.org/debian trixie/main i386 ruby3.1-dev i386 3.1.2-8.5 [1003 kB]
Get: 130 http://deb.debian.org/debian trixie/main i386 ruby3.3 i386 3.3.7-1 [827 kB]
Get: 131 http://deb.debian.org/debian trixie/main i386 ruby3.3-dev i386 3.3.7-1 [1038 kB]
Get: 132 http://deb.debian.org/debian trixie/main i386 ruby-all-dev i386 1:3.1+support3.3 [5976 B]
Get: 133 http://deb.debian.org/debian trixie/main i386 gem2deb i386 2.2.5 [48.0 kB]
Get: 134 http://deb.debian.org/debian trixie/main i386 ruby-concurrent all 1.3.4-1 [291 kB]
Get: 135 http://deb.debian.org/debian trixie/main i386 ruby-diff-lcs all 1.5.1-1 [28.1 kB]
Get: 136 http://deb.debian.org/debian trixie/main i386 ruby-rbtree i386 0.4.6-1+b2 [28.8 kB]
Get: 137 http://deb.debian.org/debian trixie/main i386 ruby-rspec-support all 3.13.0c0e0m0s1-2 [28.5 kB]
Get: 138 http://deb.debian.org/debian trixie/main i386 ruby-rspec-core all 3.13.0c0e0m0s1-2 [164 kB]
Get: 139 http://deb.debian.org/debian trixie/main i386 ruby-rspec-expectations all 3.13.0c0e0m0s1-2 [90.2 kB]
Get: 140 http://deb.debian.org/debian trixie/main i386 ruby-rspec-mocks all 3.13.0c0e0m0s1-2 [81.3 kB]
Get: 141 http://deb.debian.org/debian trixie/main i386 ruby-rspec all 3.13.0c0e0m0s1-2 [5184 B]
Get: 142 http://deb.debian.org/debian trixie/main i386 ruby-sorted-set all 1.0.3-3 [4736 B]
Fetched 56.7 MB in 1s (83.5 MB/s)
Preconfiguring packages ...
Selecting previously unselected package libpython3.13-minimal:i386.
(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 ... 19828 files and directories currently installed.)
Preparing to unpack .../libpython3.13-minimal_3.13.1-3+b1_i386.deb ...
Unpacking libpython3.13-minimal:i386 (3.13.1-3+b1) ...
Selecting previously unselected package libexpat1:i386.
Preparing to unpack .../libexpat1_2.6.4-1_i386.deb ...
Unpacking libexpat1:i386 (2.6.4-1) ...
Selecting previously unselected package python3.13-minimal.
Preparing to unpack .../python3.13-minimal_3.13.1-3+b1_i386.deb ...
Unpacking python3.13-minimal (3.13.1-3+b1) ...
Setting up libpython3.13-minimal:i386 (3.13.1-3+b1) ...
Setting up libexpat1:i386 (2.6.4-1) ...
Setting up python3.13-minimal (3.13.1-3+b1) ...
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 ... 20164 files and directories currently installed.)
Preparing to unpack .../0-python3-minimal_3.13.1-2_i386.deb ...
Unpacking python3-minimal (3.13.1-2) ...
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_2024b-6_all.deb ...
Unpacking tzdata (2024b-6) ...
Selecting previously unselected package libffi8:i386.
Preparing to unpack .../4-libffi8_3.4.6-1_i386.deb ...
Unpacking libffi8:i386 (3.4.6-1) ...
Selecting previously unselected package readline-common.
Preparing to unpack .../5-readline-common_8.2-6_all.deb ...
Unpacking readline-common (8.2-6) ...
Selecting previously unselected package libreadline8t64:i386.
Preparing to unpack .../6-libreadline8t64_8.2-6_i386.deb ...
Adding 'diversion of /lib/i386-linux-gnu/libhistory.so.8 to /lib/i386-linux-gnu/libhistory.so.8.usr-is-merged by libreadline8t64'
Adding 'diversion of /lib/i386-linux-gnu/libhistory.so.8.2 to /lib/i386-linux-gnu/libhistory.so.8.2.usr-is-merged by libreadline8t64'
Adding 'diversion of /lib/i386-linux-gnu/libreadline.so.8 to /lib/i386-linux-gnu/libreadline.so.8.usr-is-merged by libreadline8t64'
Adding 'diversion of /lib/i386-linux-gnu/libreadline.so.8.2 to /lib/i386-linux-gnu/libreadline.so.8.2.usr-is-merged by libreadline8t64'
Unpacking libreadline8t64:i386 (8.2-6) ...
Selecting previously unselected package libpython3.13-stdlib:i386.
Preparing to unpack .../7-libpython3.13-stdlib_3.13.1-3+b1_i386.deb ...
Unpacking libpython3.13-stdlib:i386 (3.13.1-3+b1) ...
Selecting previously unselected package python3.13.
Preparing to unpack .../8-python3.13_3.13.1-3+b1_i386.deb ...
Unpacking python3.13 (3.13.1-3+b1) ...
Selecting previously unselected package libpython3-stdlib:i386.
Preparing to unpack .../9-libpython3-stdlib_3.13.1-2_i386.deb ...
Unpacking libpython3-stdlib:i386 (3.13.1-2) ...
Setting up python3-minimal (3.13.1-2) ...
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 ... 21175 files and directories currently installed.)
Preparing to unpack .../000-python3_3.13.1-2_i386.deb ...
Unpacking python3 (3.13.1-2) ...
Selecting previously unselected package sensible-utils.
Preparing to unpack .../001-sensible-utils_0.0.24_all.deb ...
Unpacking sensible-utils (0.0.24) ...
Selecting previously unselected package openssl.
Preparing to unpack .../002-openssl_3.4.0-2_i386.deb ...
Unpacking openssl (3.4.0-2) ...
Selecting previously unselected package ca-certificates.
Preparing to unpack .../003-ca-certificates_20241223_all.deb ...
Unpacking ca-certificates (20241223) ...
Selecting previously unselected package libmagic-mgc.
Preparing to unpack .../004-libmagic-mgc_1%3a5.45-3+b1_i386.deb ...
Unpacking libmagic-mgc (1:5.45-3+b1) ...
Selecting previously unselected package libmagic1t64:i386.
Preparing to unpack .../005-libmagic1t64_1%3a5.45-3+b1_i386.deb ...
Unpacking libmagic1t64:i386 (1:5.45-3+b1) ...
Selecting previously unselected package file.
Preparing to unpack .../006-file_1%3a5.45-3+b1_i386.deb ...
Unpacking file (1:5.45-3+b1) ...
Selecting previously unselected package gettext-base.
Preparing to unpack .../007-gettext-base_0.23.1-1_i386.deb ...
Unpacking gettext-base (0.23.1-1) ...
Selecting previously unselected package libuchardet0:i386.
Preparing to unpack .../008-libuchardet0_0.0.8-1+b2_i386.deb ...
Unpacking libuchardet0:i386 (0.0.8-1+b2) ...
Selecting previously unselected package groff-base.
Preparing to unpack .../009-groff-base_1.23.0-7_i386.deb ...
Unpacking groff-base (1.23.0-7) ...
Selecting previously unselected package bsdextrautils.
Preparing to unpack .../010-bsdextrautils_2.40.4-2_i386.deb ...
Unpacking bsdextrautils (2.40.4-2) ...
Selecting previously unselected package libpipeline1:i386.
Preparing to unpack .../011-libpipeline1_1.5.8-1_i386.deb ...
Unpacking libpipeline1:i386 (1.5.8-1) ...
Selecting previously unselected package man-db.
Preparing to unpack .../012-man-db_2.13.0-1_i386.deb ...
Unpacking man-db (2.13.0-1) ...
Selecting previously unselected package m4.
Preparing to unpack .../013-m4_1.4.19-5_i386.deb ...
Unpacking m4 (1.4.19-5) ...
Selecting previously unselected package autoconf.
Preparing to unpack .../014-autoconf_2.72-3_all.deb ...
Unpacking autoconf (2.72-3) ...
Selecting previously unselected package autotools-dev.
Preparing to unpack .../015-autotools-dev_20220109.1_all.deb ...
Unpacking autotools-dev (20220109.1) ...
Selecting previously unselected package automake.
Preparing to unpack .../016-automake_1%3a1.17-3_all.deb ...
Unpacking automake (1:1.17-3) ...
Selecting previously unselected package autopoint.
Preparing to unpack .../017-autopoint_0.23.1-1_all.deb ...
Unpacking autopoint (0.23.1-1) ...
Selecting previously unselected package libdebhelper-perl.
Preparing to unpack .../018-libdebhelper-perl_13.24.1_all.deb ...
Unpacking libdebhelper-perl (13.24.1) ...
Selecting previously unselected package libtool.
Preparing to unpack .../019-libtool_2.5.4-3_all.deb ...
Unpacking libtool (2.5.4-3) ...
Selecting previously unselected package dh-autoreconf.
Preparing to unpack .../020-dh-autoreconf_20_all.deb ...
Unpacking dh-autoreconf (20) ...
Selecting previously unselected package libarchive-zip-perl.
Preparing to unpack .../021-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 .../022-libfile-stripnondeterminism-perl_1.14.1-1_all.deb ...
Unpacking libfile-stripnondeterminism-perl (1.14.1-1) ...
Selecting previously unselected package dh-strip-nondeterminism.
Preparing to unpack .../023-dh-strip-nondeterminism_1.14.1-1_all.deb ...
Unpacking dh-strip-nondeterminism (1.14.1-1) ...
Selecting previously unselected package libelf1t64:i386.
Preparing to unpack .../024-libelf1t64_0.192-4_i386.deb ...
Unpacking libelf1t64:i386 (0.192-4) ...
Selecting previously unselected package dwz.
Preparing to unpack .../025-dwz_0.15-1+b1_i386.deb ...
Unpacking dwz (0.15-1+b1) ...
Selecting previously unselected package libunistring5:i386.
Preparing to unpack .../026-libunistring5_1.3-1_i386.deb ...
Unpacking libunistring5:i386 (1.3-1) ...
Selecting previously unselected package libicu72:i386.
Preparing to unpack .../027-libicu72_72.1-6_i386.deb ...
Unpacking libicu72:i386 (72.1-6) ...
Selecting previously unselected package libxml2:i386.
Preparing to unpack .../028-libxml2_2.12.7+dfsg+really2.9.14-0.2+b1_i386.deb ...
Unpacking libxml2:i386 (2.12.7+dfsg+really2.9.14-0.2+b1) ...
Selecting previously unselected package gettext.
Preparing to unpack .../029-gettext_0.23.1-1_i386.deb ...
Unpacking gettext (0.23.1-1) ...
Selecting previously unselected package intltool-debian.
Preparing to unpack .../030-intltool-debian_0.35.0+20060710.6_all.deb ...
Unpacking intltool-debian (0.35.0+20060710.6) ...
Selecting previously unselected package po-debconf.
Preparing to unpack .../031-po-debconf_1.0.21+nmu1_all.deb ...
Unpacking po-debconf (1.0.21+nmu1) ...
Selecting previously unselected package debhelper.
Preparing to unpack .../032-debhelper_13.24.1_all.deb ...
Unpacking debhelper (13.24.1) ...
Selecting previously unselected package libgpg-error0:i386.
Preparing to unpack .../033-libgpg-error0_1.51-3_i386.deb ...
Unpacking libgpg-error0:i386 (1.51-3) ...
Selecting previously unselected package libassuan9:i386.
Preparing to unpack .../034-libassuan9_3.0.1-2_i386.deb ...
Unpacking libassuan9:i386 (3.0.1-2) ...
Selecting previously unselected package libgcrypt20:i386.
Preparing to unpack .../035-libgcrypt20_1.11.0-7_i386.deb ...
Unpacking libgcrypt20:i386 (1.11.0-7) ...
Selecting previously unselected package gpgconf.
Preparing to unpack .../036-gpgconf_2.2.46-1+b1_i386.deb ...
Unpacking gpgconf (2.2.46-1+b1) ...
Selecting previously unselected package libidn2-0:i386.
Preparing to unpack .../037-libidn2-0_2.3.7-2+b1_i386.deb ...
Unpacking libidn2-0:i386 (2.3.7-2+b1) ...
Selecting previously unselected package libp11-kit0:i386.
Preparing to unpack .../038-libp11-kit0_0.25.5-3_i386.deb ...
Unpacking libp11-kit0:i386 (0.25.5-3) ...
Selecting previously unselected package libtasn1-6:i386.
Preparing to unpack .../039-libtasn1-6_4.19.0-3+b3_i386.deb ...
Unpacking libtasn1-6:i386 (4.19.0-3+b3) ...
Selecting previously unselected package libgnutls30t64:i386.
Preparing to unpack .../040-libgnutls30t64_3.8.8-2_i386.deb ...
Unpacking libgnutls30t64:i386 (3.8.8-2) ...
Selecting previously unselected package libksba8:i386.
Preparing to unpack .../041-libksba8_1.6.7-2+b1_i386.deb ...
Unpacking libksba8:i386 (1.6.7-2+b1) ...
Selecting previously unselected package libsasl2-modules-db:i386.
Preparing to unpack .../042-libsasl2-modules-db_2.1.28+dfsg1-8+b1_i386.deb ...
Unpacking libsasl2-modules-db:i386 (2.1.28+dfsg1-8+b1) ...
Selecting previously unselected package libsasl2-2:i386.
Preparing to unpack .../043-libsasl2-2_2.1.28+dfsg1-8+b1_i386.deb ...
Unpacking libsasl2-2:i386 (2.1.28+dfsg1-8+b1) ...
Selecting previously unselected package libldap2:i386.
Preparing to unpack .../044-libldap2_2.6.9+dfsg-1_i386.deb ...
Unpacking libldap2:i386 (2.6.9+dfsg-1) ...
Selecting previously unselected package libnpth0t64:i386.
Preparing to unpack .../045-libnpth0t64_1.8-2_i386.deb ...
Unpacking libnpth0t64:i386 (1.8-2) ...
Selecting previously unselected package dirmngr.
Preparing to unpack .../046-dirmngr_2.2.46-1+b1_i386.deb ...
Unpacking dirmngr (2.2.46-1+b1) ...
Selecting previously unselected package gnupg-l10n.
Preparing to unpack .../047-gnupg-l10n_2.2.46-1_all.deb ...
Unpacking gnupg-l10n (2.2.46-1) ...
Selecting previously unselected package gpg.
Preparing to unpack .../048-gpg_2.2.46-1+b1_i386.deb ...
Unpacking gpg (2.2.46-1+b1) ...
Selecting previously unselected package pinentry-curses.
Preparing to unpack .../049-pinentry-curses_1.3.1-2_i386.deb ...
Unpacking pinentry-curses (1.3.1-2) ...
Selecting previously unselected package gpg-agent.
Preparing to unpack .../050-gpg-agent_2.2.46-1+b1_i386.deb ...
Unpacking gpg-agent (2.2.46-1+b1) ...
Selecting previously unselected package gpgsm.
Preparing to unpack .../051-gpgsm_2.2.46-1+b1_i386.deb ...
Unpacking gpgsm (2.2.46-1+b1) ...
Selecting previously unselected package gnupg.
Preparing to unpack .../052-gnupg_2.2.46-1_all.deb ...
Unpacking gnupg (2.2.46-1) ...
Selecting previously unselected package gpgv.
Preparing to unpack .../053-gpgv_2.2.46-1+b1_i386.deb ...
Unpacking gpgv (2.2.46-1+b1) ...
Selecting previously unselected package sopv-gpgv.
Preparing to unpack .../054-sopv-gpgv_0.1.1-1_all.deb ...
Unpacking sopv-gpgv (0.1.1-1) ...
Selecting previously unselected package libfile-dirlist-perl.
Preparing to unpack .../055-libfile-dirlist-perl_0.05-3_all.deb ...
Unpacking libfile-dirlist-perl (0.05-3) ...
Selecting previously unselected package libfile-which-perl.
Preparing to unpack .../056-libfile-which-perl_1.27-2_all.deb ...
Unpacking libfile-which-perl (1.27-2) ...
Selecting previously unselected package libfile-homedir-perl.
Preparing to unpack .../057-libfile-homedir-perl_1.006-2_all.deb ...
Unpacking libfile-homedir-perl (1.006-2) ...
Selecting previously unselected package libfile-touch-perl.
Preparing to unpack .../058-libfile-touch-perl_0.12-2_all.deb ...
Unpacking libfile-touch-perl (0.12-2) ...
Selecting previously unselected package libio-pty-perl.
Preparing to unpack .../059-libio-pty-perl_1%3a1.20-1+b3_i386.deb ...
Unpacking libio-pty-perl (1:1.20-1+b3) ...
Selecting previously unselected package libipc-run-perl.
Preparing to unpack .../060-libipc-run-perl_20231003.0-2_all.deb ...
Unpacking libipc-run-perl (20231003.0-2) ...
Selecting previously unselected package libclass-method-modifiers-perl.
Preparing to unpack .../061-libclass-method-modifiers-perl_2.15-1_all.deb ...
Unpacking libclass-method-modifiers-perl (2.15-1) ...
Selecting previously unselected package libclass-xsaccessor-perl.
Preparing to unpack .../062-libclass-xsaccessor-perl_1.19-4+b4_i386.deb ...
Unpacking libclass-xsaccessor-perl (1.19-4+b4) ...
Selecting previously unselected package libb-hooks-op-check-perl:i386.
Preparing to unpack .../063-libb-hooks-op-check-perl_0.22-3+b2_i386.deb ...
Unpacking libb-hooks-op-check-perl:i386 (0.22-3+b2) ...
Selecting previously unselected package libdynaloader-functions-perl.
Preparing to unpack .../064-libdynaloader-functions-perl_0.004-1_all.deb ...
Unpacking libdynaloader-functions-perl (0.004-1) ...
Selecting previously unselected package libdevel-callchecker-perl:i386.
Preparing to unpack .../065-libdevel-callchecker-perl_0.009-1+b1_i386.deb ...
Unpacking libdevel-callchecker-perl:i386 (0.009-1+b1) ...
Selecting previously unselected package libparams-classify-perl:i386.
Preparing to unpack .../066-libparams-classify-perl_0.015-2+b4_i386.deb ...
Unpacking libparams-classify-perl:i386 (0.015-2+b4) ...
Selecting previously unselected package libmodule-runtime-perl.
Preparing to unpack .../067-libmodule-runtime-perl_0.016-2_all.deb ...
Unpacking libmodule-runtime-perl (0.016-2) ...
Selecting previously unselected package libimport-into-perl.
Preparing to unpack .../068-libimport-into-perl_1.002005-2_all.deb ...
Unpacking libimport-into-perl (1.002005-2) ...
Selecting previously unselected package librole-tiny-perl.
Preparing to unpack .../069-librole-tiny-perl_2.002004-1_all.deb ...
Unpacking librole-tiny-perl (2.002004-1) ...
Selecting previously unselected package libsub-quote-perl.
Preparing to unpack .../070-libsub-quote-perl_2.006008-1_all.deb ...
Unpacking libsub-quote-perl (2.006008-1) ...
Selecting previously unselected package libmoo-perl.
Preparing to unpack .../071-libmoo-perl_2.005005-1_all.deb ...
Unpacking libmoo-perl (2.005005-1) ...
Selecting previously unselected package libencode-locale-perl.
Preparing to unpack .../072-libencode-locale-perl_1.05-3_all.deb ...
Unpacking libencode-locale-perl (1.05-3) ...
Selecting previously unselected package libtimedate-perl.
Preparing to unpack .../073-libtimedate-perl_2.3300-2_all.deb ...
Unpacking libtimedate-perl (2.3300-2) ...
Selecting previously unselected package libhttp-date-perl.
Preparing to unpack .../074-libhttp-date-perl_6.06-1_all.deb ...
Unpacking libhttp-date-perl (6.06-1) ...
Selecting previously unselected package libfile-listing-perl.
Preparing to unpack .../075-libfile-listing-perl_6.16-1_all.deb ...
Unpacking libfile-listing-perl (6.16-1) ...
Selecting previously unselected package libhtml-tagset-perl.
Preparing to unpack .../076-libhtml-tagset-perl_3.24-1_all.deb ...
Unpacking libhtml-tagset-perl (3.24-1) ...
Selecting previously unselected package liburi-perl.
Preparing to unpack .../077-liburi-perl_5.30-1_all.deb ...
Unpacking liburi-perl (5.30-1) ...
Selecting previously unselected package libhtml-parser-perl:i386.
Preparing to unpack .../078-libhtml-parser-perl_3.83-1+b2_i386.deb ...
Unpacking libhtml-parser-perl:i386 (3.83-1+b2) ...
Selecting previously unselected package libhtml-tree-perl.
Preparing to unpack .../079-libhtml-tree-perl_5.07-3_all.deb ...
Unpacking libhtml-tree-perl (5.07-3) ...
Selecting previously unselected package libclone-perl:i386.
Preparing to unpack .../080-libclone-perl_0.47-1+b1_i386.deb ...
Unpacking libclone-perl:i386 (0.47-1+b1) ...
Selecting previously unselected package libio-html-perl.
Preparing to unpack .../081-libio-html-perl_1.004-3_all.deb ...
Unpacking libio-html-perl (1.004-3) ...
Selecting previously unselected package liblwp-mediatypes-perl.
Preparing to unpack .../082-liblwp-mediatypes-perl_6.04-2_all.deb ...
Unpacking liblwp-mediatypes-perl (6.04-2) ...
Selecting previously unselected package libhttp-message-perl.
Preparing to unpack .../083-libhttp-message-perl_7.00-2_all.deb ...
Unpacking libhttp-message-perl (7.00-2) ...
Selecting previously unselected package libhttp-cookies-perl.
Preparing to unpack .../084-libhttp-cookies-perl_6.11-1_all.deb ...
Unpacking libhttp-cookies-perl (6.11-1) ...
Selecting previously unselected package libhttp-negotiate-perl.
Preparing to unpack .../085-libhttp-negotiate-perl_6.01-2_all.deb ...
Unpacking libhttp-negotiate-perl (6.01-2) ...
Selecting previously unselected package perl-openssl-defaults:i386.
Preparing to unpack .../086-perl-openssl-defaults_7+b2_i386.deb ...
Unpacking perl-openssl-defaults:i386 (7+b2) ...
Selecting previously unselected package libnet-ssleay-perl:i386.
Preparing to unpack .../087-libnet-ssleay-perl_1.94-2_i386.deb ...
Unpacking libnet-ssleay-perl:i386 (1.94-2) ...
Selecting previously unselected package libio-socket-ssl-perl.
Preparing to unpack .../088-libio-socket-ssl-perl_2.089-1_all.deb ...
Unpacking libio-socket-ssl-perl (2.089-1) ...
Selecting previously unselected package libnet-http-perl.
Preparing to unpack .../089-libnet-http-perl_6.23-1_all.deb ...
Unpacking libnet-http-perl (6.23-1) ...
Selecting previously unselected package liblwp-protocol-https-perl.
Preparing to unpack .../090-liblwp-protocol-https-perl_6.14-1_all.deb ...
Unpacking liblwp-protocol-https-perl (6.14-1) ...
Selecting previously unselected package libtry-tiny-perl.
Preparing to unpack .../091-libtry-tiny-perl_0.32-1_all.deb ...
Unpacking libtry-tiny-perl (0.32-1) ...
Selecting previously unselected package libwww-robotrules-perl.
Preparing to unpack .../092-libwww-robotrules-perl_6.02-1_all.deb ...
Unpacking libwww-robotrules-perl (6.02-1) ...
Selecting previously unselected package libwww-perl.
Preparing to unpack .../093-libwww-perl_6.77-1_all.deb ...
Unpacking libwww-perl (6.77-1) ...
Selecting previously unselected package patchutils.
Preparing to unpack .../094-patchutils_0.4.2-1_i386.deb ...
Unpacking patchutils (0.4.2-1) ...
Selecting previously unselected package wdiff.
Preparing to unpack .../095-wdiff_1.2.2-7_i386.deb ...
Unpacking wdiff (1.2.2-7) ...
Selecting previously unselected package devscripts.
Preparing to unpack .../096-devscripts_2.25.2_all.deb ...
Unpacking devscripts (2.25.2) ...
Selecting previously unselected package rubygems-integration.
Preparing to unpack .../097-rubygems-integration_1.19_all.deb ...
Unpacking rubygems-integration (1.19) ...
Selecting previously unselected package ruby-net-telnet.
Preparing to unpack .../098-ruby-net-telnet_0.2.0-1_all.deb ...
Unpacking ruby-net-telnet (0.2.0-1) ...
Selecting previously unselected package ruby-webrick.
Preparing to unpack .../099-ruby-webrick_1.8.1-1_all.deb ...
Unpacking ruby-webrick (1.8.1-1) ...
Selecting previously unselected package ruby-xmlrpc.
Preparing to unpack .../100-ruby-xmlrpc_0.3.3-2_all.deb ...
Unpacking ruby-xmlrpc (0.3.3-2) ...
Selecting previously unselected package libyaml-0-2:i386.
Preparing to unpack .../101-libyaml-0-2_0.2.5-2_i386.deb ...
Unpacking libyaml-0-2:i386 (0.2.5-2) ...
Selecting previously unselected package libruby3.3:i386.
Preparing to unpack .../102-libruby3.3_3.3.7-1_i386.deb ...
Unpacking libruby3.3:i386 (3.3.7-1) ...
Selecting previously unselected package libruby:i386.
Preparing to unpack .../103-libruby_1%3a3.1+support3.3_i386.deb ...
Unpacking libruby:i386 (1:3.1+support3.3) ...
Selecting previously unselected package ruby-sdbm:i386.
Preparing to unpack .../104-ruby-sdbm_1.0.0-5+b6_i386.deb ...
Unpacking ruby-sdbm:i386 (1.0.0-5+b6) ...
Selecting previously unselected package libedit2:i386.
Preparing to unpack .../105-libedit2_3.1-20250104-1_i386.deb ...
Unpacking libedit2:i386 (3.1-20250104-1) ...
Selecting previously unselected package libncurses6:i386.
Preparing to unpack .../106-libncurses6_6.5-2+b1_i386.deb ...
Unpacking libncurses6:i386 (6.5-2+b1) ...
Selecting previously unselected package libruby3.1t64:i386.
Preparing to unpack .../107-libruby3.1t64_3.1.2-8.5_i386.deb ...
Unpacking libruby3.1t64:i386 (3.1.2-8.5) ...
Selecting previously unselected package ruby3.1.
Preparing to unpack .../108-ruby3.1_3.1.2-8.5_i386.deb ...
Unpacking ruby3.1 (3.1.2-8.5) ...
Selecting previously unselected package ruby-rubygems.
Preparing to unpack .../109-ruby-rubygems_3.6.3-1_all.deb ...
Unpacking ruby-rubygems (3.6.3-1) ...
Selecting previously unselected package ruby.
Preparing to unpack .../110-ruby_1%3a3.1+support3.3_i386.deb ...
Unpacking ruby (1:3.1+support3.3) ...
Selecting previously unselected package rake.
Preparing to unpack .../111-rake_13.2.1-1_all.deb ...
Unpacking rake (13.2.1-1) ...
Selecting previously unselected package gem2deb-test-runner.
Preparing to unpack .../112-gem2deb-test-runner_2.2.5_i386.deb ...
Unpacking gem2deb-test-runner (2.2.5) ...
Selecting previously unselected package libgmpxx4ldbl:i386.
Preparing to unpack .../113-libgmpxx4ldbl_2%3a6.3.0+dfsg-3_i386.deb ...
Unpacking libgmpxx4ldbl:i386 (2:6.3.0+dfsg-3) ...
Selecting previously unselected package libgmp-dev:i386.
Preparing to unpack .../114-libgmp-dev_2%3a6.3.0+dfsg-3_i386.deb ...
Unpacking libgmp-dev:i386 (2:6.3.0+dfsg-3) ...
Selecting previously unselected package ruby3.1-dev:i386.
Preparing to unpack .../115-ruby3.1-dev_3.1.2-8.5_i386.deb ...
Unpacking ruby3.1-dev:i386 (3.1.2-8.5) ...
Selecting previously unselected package ruby3.3.
Preparing to unpack .../116-ruby3.3_3.3.7-1_i386.deb ...
Unpacking ruby3.3 (3.3.7-1) ...
Selecting previously unselected package ruby3.3-dev:i386.
Preparing to unpack .../117-ruby3.3-dev_3.3.7-1_i386.deb ...
Unpacking ruby3.3-dev:i386 (3.3.7-1) ...
Selecting previously unselected package ruby-all-dev:i386.
Preparing to unpack .../118-ruby-all-dev_1%3a3.1+support3.3_i386.deb ...
Unpacking ruby-all-dev:i386 (1:3.1+support3.3) ...
Selecting previously unselected package gem2deb.
Preparing to unpack .../119-gem2deb_2.2.5_i386.deb ...
Unpacking gem2deb (2.2.5) ...
Selecting previously unselected package ruby-concurrent.
Preparing to unpack .../120-ruby-concurrent_1.3.4-1_all.deb ...
Unpacking ruby-concurrent (1.3.4-1) ...
Selecting previously unselected package ruby-diff-lcs.
Preparing to unpack .../121-ruby-diff-lcs_1.5.1-1_all.deb ...
Unpacking ruby-diff-lcs (1.5.1-1) ...
Selecting previously unselected package ruby-rbtree.
Preparing to unpack .../122-ruby-rbtree_0.4.6-1+b2_i386.deb ...
Unpacking ruby-rbtree (0.4.6-1+b2) ...
Selecting previously unselected package ruby-rspec-support.
Preparing to unpack .../123-ruby-rspec-support_3.13.0c0e0m0s1-2_all.deb ...
Unpacking ruby-rspec-support (3.13.0c0e0m0s1-2) ...
Selecting previously unselected package ruby-rspec-core.
Preparing to unpack .../124-ruby-rspec-core_3.13.0c0e0m0s1-2_all.deb ...
Unpacking ruby-rspec-core (3.13.0c0e0m0s1-2) ...
Selecting previously unselected package ruby-rspec-expectations.
Preparing to unpack .../125-ruby-rspec-expectations_3.13.0c0e0m0s1-2_all.deb ...
Unpacking ruby-rspec-expectations (3.13.0c0e0m0s1-2) ...
Selecting previously unselected package ruby-rspec-mocks.
Preparing to unpack .../126-ruby-rspec-mocks_3.13.0c0e0m0s1-2_all.deb ...
Unpacking ruby-rspec-mocks (3.13.0c0e0m0s1-2) ...
Selecting previously unselected package ruby-rspec.
Preparing to unpack .../127-ruby-rspec_3.13.0c0e0m0s1-2_all.deb ...
Unpacking ruby-rspec (3.13.0c0e0m0s1-2) ...
Selecting previously unselected package ruby-sorted-set.
Preparing to unpack .../128-ruby-sorted-set_1.0.3-3_all.deb ...
Unpacking ruby-sorted-set (1.0.3-3) ...
Setting up media-types (10.1.0) ...
Setting up libpipeline1:i386 (1.5.8-1) ...
Setting up wdiff (1.2.2-7) ...
Setting up libfile-which-perl (1.27-2) ...
Setting up libnpth0t64:i386 (1.8-2) ...
Setting up libicu72:i386 (72.1-6) ...
Setting up bsdextrautils (2.40.4-2) ...
Setting up libgpg-error0:i386 (1.51-3) ...
Setting up libdynaloader-functions-perl (0.004-1) ...
Setting up libclass-method-modifiers-perl (2.15-1) ...
Setting up libio-pty-perl (1:1.20-1+b3) ...
Setting up libmagic-mgc (1:5.45-3+b1) ...
Setting up libclone-perl:i386 (0.47-1+b1) ...
Setting up libarchive-zip-perl (1.68-1) ...
Setting up libyaml-0-2:i386 (0.2.5-2) ...
Setting up libhtml-tagset-perl (3.24-1) ...
Setting up libdebhelper-perl (13.24.1) ...
Setting up libedit2:i386 (3.1-20250104-1) ...
Setting up liblwp-mediatypes-perl (6.04-2) ...
Setting up libmagic1t64:i386 (1:5.45-3+b1) ...
Setting up libtry-tiny-perl (0.32-1) ...
Setting up perl-openssl-defaults:i386 (7+b2) ...
Setting up gettext-base (0.23.1-1) ...
Setting up m4 (1.4.19-5) ...
Setting up libgcrypt20:i386 (1.11.0-7) ...
Setting up libencode-locale-perl (1.05-3) ...
Setting up file (1:5.45-3+b1) ...
Setting up ruby-concurrent (1.3.4-1) ...
Setting up libelf1t64:i386 (0.192-4) ...
Setting up libsasl2-modules-db:i386 (2.1.28+dfsg1-8+b1) ...
Setting up tzdata (2024b-6) ...

Current default time zone: 'Etc/UTC'
Local time is now:      Sun Feb  9 06:37:19 UTC 2025.
Universal Time is now:  Sun Feb  9 06:37:19 UTC 2025.
Run 'dpkg-reconfigure tzdata' if you wish to change it.

Setting up autotools-dev (20220109.1) ...
Setting up libgmpxx4ldbl:i386 (2:6.3.0+dfsg-3) ...
Setting up gnupg-l10n (2.2.46-1) ...
Setting up libncurses6:i386 (6.5-2+b1) ...
Setting up ruby-net-telnet (0.2.0-1) ...
Setting up libunistring5:i386 (1.3-1) ...
Setting up libio-html-perl (1.004-3) ...
Setting up autopoint (0.23.1-1) ...
Setting up libb-hooks-op-check-perl:i386 (0.22-3+b2) ...
Setting up libipc-run-perl (20231003.0-2) ...
Setting up libsasl2-2:i386 (2.1.28+dfsg1-8+b1) ...
Setting up autoconf (2.72-3) ...
Setting up ruby-rspec-support (3.13.0c0e0m0s1-2) ...
Setting up libtimedate-perl (2.3300-2) ...
Setting up ruby-webrick (1.8.1-1) ...
Setting up libffi8:i386 (3.4.6-1) ...
Setting up dwz (0.15-1+b1) ...
Setting up sensible-utils (0.0.24) ...
Setting up gpgv (2.2.46-1+b1) ...
Setting up libuchardet0:i386 (0.0.8-1+b2) ...
Setting up libassuan9:i386 (3.0.1-2) ...
Setting up librole-tiny-perl (2.002004-1) ...
Setting up libtasn1-6:i386 (4.19.0-3+b3) ...
Setting up netbase (6.4) ...
Setting up libsub-quote-perl (2.006008-1) ...
Setting up libclass-xsaccessor-perl (1.19-4+b4) ...
Setting up libfile-dirlist-perl (0.05-3) ...
Setting up libfile-homedir-perl (1.006-2) ...
Setting up openssl (3.4.0-2) ...
Setting up readline-common (8.2-6) ...
Setting up ruby-xmlrpc (0.3.3-2) ...
Setting up libxml2:i386 (2.12.7+dfsg+really2.9.14-0.2+b1) ...
Setting up libldap2:i386 (2.6.9+dfsg-1) ...
Setting up liburi-perl (5.30-1) ...
Setting up libfile-touch-perl (0.12-2) ...
Setting up libnet-ssleay-perl:i386 (1.94-2) ...
Setting up automake (1:1.17-3) ...
update-alternatives: using /usr/bin/automake-1.17 to provide /usr/bin/automake (automake) in auto mode
Setting up libksba8:i386 (1.6.7-2+b1) ...
Setting up pinentry-curses (1.3.1-2) ...
Setting up libfile-stripnondeterminism-perl (1.14.1-1) ...
Setting up libhttp-date-perl (6.06-1) ...
Setting up gettext (0.23.1-1) ...
Setting up libgmp-dev:i386 (2:6.3.0+dfsg-3) ...
Setting up libfile-listing-perl (6.16-1) ...
Setting up libtool (2.5.4-3) ...
Setting up libnet-http-perl (6.23-1) ...
Setting up libidn2-0:i386 (2.3.7-2+b1) ...
Setting up libdevel-callchecker-perl:i386 (0.009-1+b1) ...
Setting up intltool-debian (0.35.0+20060710.6) ...
Setting up dh-autoreconf (20) ...
Setting up patchutils (0.4.2-1) ...
Setting up ca-certificates (20241223) ...
Updating certificates in /etc/ssl/certs...
152 added, 0 removed; done.
Setting up libp11-kit0:i386 (0.25.5-3) ...
Setting up libreadline8t64:i386 (8.2-6) ...
Setting up dh-strip-nondeterminism (1.14.1-1) ...
Setting up libwww-robotrules-perl (6.02-1) ...
Setting up groff-base (1.23.0-7) ...
Setting up libhtml-parser-perl:i386 (3.83-1+b2) ...
Setting up gpgconf (2.2.46-1+b1) ...
Setting up libpython3.13-stdlib:i386 (3.13.1-3+b1) ...
Setting up libio-socket-ssl-perl (2.089-1) ...
Setting up gpg (2.2.46-1+b1) ...
Setting up libpython3-stdlib:i386 (3.13.1-2) ...
Setting up libhttp-message-perl (7.00-2) ...
Setting up libgnutls30t64:i386 (3.8.8-2) ...
Setting up libhttp-negotiate-perl (6.01-2) ...
Setting up gpg-agent (2.2.46-1+b1) ...
Setting up libhttp-cookies-perl (6.11-1) ...
Setting up python3.13 (3.13.1-3+b1) ...
Setting up po-debconf (1.0.21+nmu1) ...
Setting up libhtml-tree-perl (5.07-3) ...
Setting up libparams-classify-perl:i386 (0.015-2+b4) ...
Setting up gpgsm (2.2.46-1+b1) ...
Setting up python3 (3.13.1-2) ...
Setting up rubygems-integration (1.19) ...
Setting up sopv-gpgv (0.1.1-1) ...
update-alternatives: using /usr/bin/sopv-gpgv to provide /usr/bin/sopv (sopv) in auto mode
Setting up man-db (2.13.0-1) ...
Not building database; man-db/auto-update is not 'true'.
Setting up dirmngr (2.2.46-1+b1) ...
Setting up libmodule-runtime-perl (0.016-2) ...
Setting up gnupg (2.2.46-1) ...
Setting up libimport-into-perl (1.002005-2) ...
Setting up libmoo-perl (2.005005-1) ...
Setting up debhelper (13.24.1) ...
Setting up rake (13.2.1-1) ...
Setting up liblwp-protocol-https-perl (6.14-1) ...
Setting up libruby:i386 (1:3.1+support3.3) ...
Setting up libwww-perl (6.77-1) ...
Setting up libruby3.3:i386 (3.3.7-1) ...
Setting up ruby-rubygems (3.6.3-1) ...
Setting up devscripts (2.25.2) ...
Setting up ruby-rbtree (0.4.6-1+b2) ...
Setting up ruby3.3-dev:i386 (3.3.7-1) ...
Setting up ruby3.3 (3.3.7-1) ...
Setting up ruby-sdbm:i386 (1.0.0-5+b6) ...
Setting up ruby-sorted-set (1.0.3-3) ...
Setting up libruby3.1t64:i386 (3.1.2-8.5) ...
Setting up ruby3.1 (3.1.2-8.5) ...
Setting up ruby3.1-dev:i386 (3.1.2-8.5) ...
Setting up ruby-all-dev:i386 (1:3.1+support3.3) ...
Setting up ruby (1:3.1+support3.3) ...
Setting up ruby-rspec-core (3.13.0c0e0m0s1-2) ...
Setting up ruby-diff-lcs (1.5.1-1) ...
Setting up gem2deb-test-runner (2.2.5) ...
Setting up ruby-rspec-expectations (3.13.0c0e0m0s1-2) ...
Setting up ruby-rspec-mocks (3.13.0c0e0m0s1-2) ...
Setting up gem2deb (2.2.5) ...
Setting up ruby-rspec (3.13.0c0e0m0s1-2) ...
Processing triggers for libc-bin (2.40-6) ...
Processing triggers for ca-certificates (20241223) ...
Updating certificates in /etc/ssl/certs...
0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
Reading package lists...
Building dependency tree...
Reading state information...
Reading extended state information...
Initializing package states...
Writing extended state information...
Building tag database...
 -> Finished parsing the build-deps
I: Building the package
I: Running cd /build/reproducible-path/ruby-immutable-ruby-0.1.0/ && env PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" HOME="/nonexistent/first-build" dpkg-buildpackage -us -uc -b && env PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" HOME="/nonexistent/first-build" dpkg-genchanges -S  > ../ruby-immutable-ruby_0.1.0-2_source.changes
dpkg-buildpackage: info: source package ruby-immutable-ruby
dpkg-buildpackage: info: source version 0.1.0-2
dpkg-buildpackage: info: source distribution unstable
dpkg-buildpackage: info: source changed by Jeremy Bícha <jbicha@ubuntu.com>
 dpkg-source --before-build .
dpkg-buildpackage: info: host architecture i386
 debian/rules clean
dh clean --buildsystem=ruby --with ruby
   dh_auto_clean -O--buildsystem=ruby
	dh_ruby --clean
   dh_autoreconf_clean -O--buildsystem=ruby
   dh_clean -O--buildsystem=ruby
 debian/rules binary
dh binary --buildsystem=ruby --with ruby
   dh_update_autotools_config -O--buildsystem=ruby
   dh_autoreconf -O--buildsystem=ruby
   dh_auto_configure -O--buildsystem=ruby
	dh_ruby --configure
   dh_auto_build -O--buildsystem=ruby
	dh_ruby --build
   dh_auto_test -O--buildsystem=ruby
	dh_ruby --test
   create-stamp debian/debhelper-build-stamp
   dh_testroot -O--buildsystem=ruby
   dh_prep -O--buildsystem=ruby
   dh_auto_install --destdir=debian/ruby-immutable-ruby/ -O--buildsystem=ruby
	dh_ruby --install /build/reproducible-path/ruby-immutable-ruby-0.1.0/debian/ruby-immutable-ruby

┌──────────────────────────────────────────────────────────────────────────────┐
│ ruby-immutable-ruby: Installing files and building extensions for ruby3.1    │
└──────────────────────────────────────────────────────────────────────────────┘

/usr/bin/ruby3.1 -S gem build --config-file /dev/null --verbose /tmp/d20250208-24917-cprzkf/gemspec
WARNING:  description and summary are identical
WARNING:  open-ended dependency on bundler (>= 2.2.10, development) is not recommended
  if bundler is semantically versioned, use:
    add_development_dependency "bundler", "~> 2.2", ">= 2.2.10"
WARNING:  See https://guides.rubygems.org/specification-reference/ for help
  Successfully built RubyGem
  Name: immutable-ruby
  Version: 0.1.0
  File: immutable-ruby-0.1.0.gem
/usr/bin/ruby3.1 -S gem install --config-file /dev/null --verbose --local --verbose --no-document --ignore-dependencies --install-dir debian/ruby-immutable-ruby/usr/share/rubygems-integration/all /tmp/d20250208-24917-cprzkf/immutable-ruby-0.1.0.gem
/build/reproducible-path/ruby-immutable-ruby-0.1.0/debian/ruby-immutable-ruby/usr/share/rubygems-integration/all/gems/immutable-ruby-0.1.0/lib/immutable.rb
/build/reproducible-path/ruby-immutable-ruby-0.1.0/debian/ruby-immutable-ruby/usr/share/rubygems-integration/all/gems/immutable-ruby-0.1.0/lib/immutable/core_ext.rb
/build/reproducible-path/ruby-immutable-ruby-0.1.0/debian/ruby-immutable-ruby/usr/share/rubygems-integration/all/gems/immutable-ruby-0.1.0/lib/immutable/core_ext/enumerable.rb
/build/reproducible-path/ruby-immutable-ruby-0.1.0/debian/ruby-immutable-ruby/usr/share/rubygems-integration/all/gems/immutable-ruby-0.1.0/lib/immutable/core_ext/io.rb
/build/reproducible-path/ruby-immutable-ruby-0.1.0/debian/ruby-immutable-ruby/usr/share/rubygems-integration/all/gems/immutable-ruby-0.1.0/lib/immutable/deque.rb
/build/reproducible-path/ruby-immutable-ruby-0.1.0/debian/ruby-immutable-ruby/usr/share/rubygems-integration/all/gems/immutable-ruby-0.1.0/lib/immutable/enumerable.rb
/build/reproducible-path/ruby-immutable-ruby-0.1.0/debian/ruby-immutable-ruby/usr/share/rubygems-integration/all/gems/immutable-ruby-0.1.0/lib/immutable/hash.rb
/build/reproducible-path/ruby-immutable-ruby-0.1.0/debian/ruby-immutable-ruby/usr/share/rubygems-integration/all/gems/immutable-ruby-0.1.0/lib/immutable/list.rb
/build/reproducible-path/ruby-immutable-ruby-0.1.0/debian/ruby-immutable-ruby/usr/share/rubygems-integration/all/gems/immutable-ruby-0.1.0/lib/immutable/nested.rb
/build/reproducible-path/ruby-immutable-ruby-0.1.0/debian/ruby-immutable-ruby/usr/share/rubygems-integration/all/gems/immutable-ruby-0.1.0/lib/immutable/set.rb
/build/reproducible-path/ruby-immutable-ruby-0.1.0/debian/ruby-immutable-ruby/usr/share/rubygems-integration/all/gems/immutable-ruby-0.1.0/lib/immutable/sorted_set.rb
/build/reproducible-path/ruby-immutable-ruby-0.1.0/debian/ruby-immutable-ruby/usr/share/rubygems-integration/all/gems/immutable-ruby-0.1.0/lib/immutable/trie.rb
/build/reproducible-path/ruby-immutable-ruby-0.1.0/debian/ruby-immutable-ruby/usr/share/rubygems-integration/all/gems/immutable-ruby-0.1.0/lib/immutable/undefined.rb
/build/reproducible-path/ruby-immutable-ruby-0.1.0/debian/ruby-immutable-ruby/usr/share/rubygems-integration/all/gems/immutable-ruby-0.1.0/lib/immutable/vector.rb
/build/reproducible-path/ruby-immutable-ruby-0.1.0/debian/ruby-immutable-ruby/usr/share/rubygems-integration/all/gems/immutable-ruby-0.1.0/lib/immutable/version.rb
Successfully installed immutable-ruby-0.1.0
1 gem installed
cd debian/ruby-immutable-ruby/usr/share/rubygems-integration/all
rm -rf bin
rm -rf build_info
rm -rf cache
rm -rf doc
rm -rf extensions
rmdir plugins
cd gems/immutable-ruby-0.1.0
rm -f 
chmod 644 lib/immutable/core_ext/enumerable.rb lib/immutable/core_ext/io.rb lib/immutable/core_ext.rb lib/immutable/deque.rb lib/immutable/enumerable.rb lib/immutable/hash.rb lib/immutable/list.rb lib/immutable/nested.rb lib/immutable/set.rb lib/immutable/sorted_set.rb lib/immutable/trie.rb lib/immutable/undefined.rb lib/immutable/vector.rb lib/immutable/version.rb lib/immutable.rb
find lib/ -type d -empty -delete
cd -
cd -
/usr/bin/ruby3.1 /usr/bin/gem2deb-test-runner

┌──────────────────────────────────────────────────────────────────────────────┐
│ Checking Rubygems dependency resolution on ruby3.1                           │
└──────────────────────────────────────────────────────────────────────────────┘

RUBYLIB=. GEM_PATH=/build/reproducible-path/ruby-immutable-ruby-0.1.0/debian/ruby-immutable-ruby/usr/share/rubygems-integration/all:/build/reproducible-path/ruby-immutable-ruby-0.1.0/debian/.debhelper/generated/_source/home/.local/share/gem/ruby/3.1.0:/var/lib/gems/3.1.0:/usr/local/lib/ruby/gems/3.1.0:/usr/lib/ruby/gems/3.1.0:/usr/lib/i386-linux-gnu/ruby/gems/3.1.0:/usr/share/rubygems-integration/3.1.0:/usr/share/rubygems-integration/all:/usr/lib/i386-linux-gnu/rubygems-integration/3.1.0 ruby3.1 -e gem\ \"immutable-ruby\"

┌──────────────────────────────────────────────────────────────────────────────┐
│ Run tests for ruby3.1 from debian/ruby-tests.rake                            │
└──────────────────────────────────────────────────────────────────────────────┘

RUBYLIB=. GEM_PATH=/build/reproducible-path/ruby-immutable-ruby-0.1.0/debian/ruby-immutable-ruby/usr/share/rubygems-integration/all:/build/reproducible-path/ruby-immutable-ruby-0.1.0/debian/.debhelper/generated/_source/home/.local/share/gem/ruby/3.1.0:/var/lib/gems/3.1.0:/usr/local/lib/ruby/gems/3.1.0:/usr/lib/ruby/gems/3.1.0:/usr/lib/i386-linux-gnu/ruby/gems/3.1.0:/usr/share/rubygems-integration/3.1.0:/usr/share/rubygems-integration/all:/usr/lib/i386-linux-gnu/rubygems-integration/3.1.0 ruby3.1 -S rake --rakelibdir /gem2deb-nonexistent -f debian/ruby-tests.rake
/usr/bin/ruby3.1 -I/usr/share/rubygems-integration/all/gems/rspec-support-3.13.1/lib:/usr/share/rubygems-integration/all/gems/rspec-core-3.13.0/lib /usr/share/rubygems-integration/all/gems/rspec-core-3.13.0/exe/rspec --pattern ./spec/\*\*/\*_spec.rb --format documentation

Array
  #to_list
    returns an equivalent Immutable list

Enumerable
  #to_list
    returns an equivalent list
    works on Ranges

IO
  #to_list
    with a File
      returns an equivalent list
    with a StringIO
      returns an equivalent list

Immutable::Deque
  #clear
    on []
      preserves the original
      returns an empty deque
    on ["A"]
      preserves the original
      returns an empty deque
    on ["A", "B", "C"]
      preserves the original
      returns an empty deque
  from a subclass
    returns an instance of the subclass

Immutable::Deque
  .[]
    with no arguments
      always returns the same instance
      returns an empty, frozen deque
    with a number of items
      always returns a different instance
      is the same as repeatedly using #endeque

Immutable::Deque
  on []
    returns self
  on ["A"]
    returns self
  on ["A", "B", "C"]
    returns self
  on []
    returns self
  on ["A"]
    returns self
  on ["A", "B", "C"]
    returns self

Immutable::Deque
  #dequeue
    on []
      preserves the original
      returns []
    on ["A"]
      preserves the original
      returns []
    on ["A", "B", "C"]
      preserves the original
      returns ["B", "C"]
  on empty subclass
    returns empty object of same class
  #shift
    on []
      preserves the original
      returns []
    on ["A"]
      preserves the original
      returns []
    on ["A", "B", "C"]
      preserves the original
      returns ["B", "C"]
  on empty subclass
    returns empty object of same class

Immutable::Deque
  #empty?
    on []
      returns true
    on ["A"]
      returns false
    on ["A", "B", "C"]
      returns false
    after dedequeing an item from ["A", "B", "C"]
      returns false
  .empty
    returns the canonical empty deque
    from a subclass
      returns an empty instance of the subclass

Immutable::Deque
  #enqueue
    on [] with "A"
      preserves the original
      returns ["A"]
    on ["A"] with "B"
      preserves the original
      returns ["A", "B"]
    on ["A"] with "A"
      preserves the original
      returns ["A", "A"]
    on ["A", "B", "C"] with "D"
      preserves the original
      returns ["A", "B", "C", "D"]
  #push
    on [] with "A"
      preserves the original
      returns ["A"]
    on ["A"] with "B"
      preserves the original
      returns ["A", "B"]
    on ["A"] with "A"
      preserves the original
      returns ["A", "A"]
    on ["A", "B", "C"] with "D"
      preserves the original
      returns ["A", "B", "C", "D"]

Immutable::Deque
  #first
    on []
      returns nil
    on ["A"]
      returns "A"
    on ["A", "B", "C"]
      returns "A"

Immutable::Deque
  #inspect
    on []
      returns "Immutable::Deque[]"
      returns a string which can be eval'd to get an equivalent object
    on ["A"]
      returns "Immutable::Deque[\"A\"]"
      returns a string which can be eval'd to get an equivalent object
    on ["A", "B", "C"]
      returns "Immutable::Deque[\"A\", \"B\", \"C\"]"
      returns a string which can be eval'd to get an equivalent object

Immutable::Deque
  #last
    on []
      returns nil
    on ["A"]
      returns "A"
    on ["A", "B", "C"]
      returns "C"

Immutable::Deque
  #marshal_dump/#marshal_load
    can survive dumping and loading into a new process
    is still possible to push and pop items after loading

Immutable::Deque
  .new
    accepts a single enumerable argument and creates a new deque
    is amenable to overriding of #initialize
    from a subclass
      returns a frozen instance of the subclass
  .[]
    accepts a variable number of items and creates a new deque

Immutable::Deque
  #pop
    on []
      preserves the original
      returns []
      returns a frozen instance
    on ["A"]
      preserves the original
      returns []
      returns a frozen instance
    on ["A", "B", "C"]
      preserves the original
      returns ["A", "B"]
      returns a frozen instance
    on empty subclass
      returns an empty object of the same class

Immutable::Deque
  #pretty_print
    prints the whole Deque on one line if it fits
    prints each item on its own line, if not

Immutable::Deque
  #push
    pushing "A" into []
      preserves the original
      returns ["A"]
      returns a frozen instance
    pushing "B" into ["A"]
      preserves the original
      returns ["A", "B"]
      returns a frozen instance
    pushing "D" into ["A", "B", "C"]
      preserves the original
      returns ["A", "B", "C", "D"]
      returns a frozen instance
    on a subclass
      returns an object of same class

Immutable::Deque
  modification (using #push, #pop, #shift, and #unshift)
    works when applied in many random combinations

Immutable::Deque
  #rotate
    on []
      preserves the original
      returns []
      returns a frozen instance
    on ["A"]
      preserves the original
      returns ["A"]
      returns a frozen instance
    on ["A", "B", "C"]
      preserves the original
      returns ["B", "C", "A"]
      returns a frozen instance
    on ["A", "B", "C", "D"]
      preserves the original
      returns ["A", "B", "C", "D"]
      returns a frozen instance
    on ["A", "B", "C", "D"]
      preserves the original
      returns ["C", "D", "A", "B"]
      returns a frozen instance
    on a Deque with most items on 'front' list
      works with a small rotation
      works with a larger rotation
    on a Deque with most items on 'rear' list
      works with a small rotation
      works with a larger rotation
    on empty subclass
      returns an empty object of the same class

Immutable::Deque
  #shift
    on []
      preserves the original
      returns []
      returns a frozen instance
    on ["A"]
      preserves the original
      returns []
      returns a frozen instance
    on ["A", "B", "C"]
      preserves the original
      returns ["B", "C"]
      returns a frozen instance

Immutable::Deque
  #size
    on []
      returns 0
    on ["A"]
      returns 1
    on ["A", "B", "C"]
      returns 3
  #length
    on []
      returns 0
    on ["A"]
      returns 1
    on ["A", "B", "C"]
      returns 3

Immutable::Deque
  #to_a
    on []
      returns []
      returns a mutable array
    on ["A"]
      returns ["A"]
      returns a mutable array
    on ["A", "B", "C"]
      returns ["A", "B", "C"]
      returns a mutable array
  #entries
    on []
      returns []
      returns a mutable array
    on ["A"]
      returns ["A"]
      returns a mutable array
    on ["A", "B", "C"]
      returns ["A", "B", "C"]
      returns a mutable array

Immutable::Deque
  #to_ary
    enables implicit conversion to
      block parameters
      method arguments
      works with splat

Immutable::Deque
  #to_list
    on []
      returns a list containing []
    on ["A"]
      returns a list containing ["A"]
    on ["A", "B", "C"]
      returns a list containing ["A", "B", "C"]
    after dedequeing an item from ["A", "B", "C"]
      returns a list containing ["B", "C"]

Immutable::Deque
  #unshift
    on [] with "A"
      preserves the original
      returns ["A"]
      returns a frozen instance
    on ["A"] with "B"
      preserves the original
      returns ["B", "A"]
      returns a frozen instance
    on ["A"] with "A"
      preserves the original
      returns ["A", "A"]
      returns a frozen instance
    on ["A", "B", "C"] with "D"
      preserves the original
      returns ["D", "A", "B", "C"]
      returns a frozen instance

Immutable::Hash
  #all?
    when empty
      without a block
        returns true
      with a block
        returns true
    when not empty
      without a block
        returns true
      with a block
        returns true if the block always returns true
        returns false if the block ever returns false
        propagates an exception from the block
        stops iterating as soon as the block returns false

Immutable::Hash
  #any?
    when empty
      with a block returns false
      with no block returns false
    when not empty
      with a block
        returns true if the block ever returns true (["A", "aye"])
        returns false if the block always returns false
        returns true if the block ever returns true (["B", "bee"])
        returns false if the block always returns false
        returns true if the block ever returns true (["C", "see"])
        returns false if the block always returns false
        returns true if the block ever returns true ([nil, "NIL"])
        returns false if the block always returns false
        propagates exceptions raised in the block
        stops iterating as soon as the block returns true
      with no block
        returns true

Immutable::Hash
  #assoc
    searches for a key/val pair with a given key
    returns nil if a matching key is not found
    returns nil even if there is a default
    uses #== to compare keys with provided object
  #rassoc
    searches for a key/val pair with a given value
    returns nil if a matching value is not found
    returns nil even if there is a default
    uses #== to compare values with provided object

Immutable::Hash
  #clear
    maintains the default Proc, if there is one
    on []
      preserves the original
      returns an empty hash
    on [{"A"=>"aye"}]
      preserves the original
      returns an empty hash
    on [{"A"=>"aye", "B"=>"bee", "C"=>"see"}]
      preserves the original
      returns an empty hash
    on a subclass
      returns an empty instance of the subclass

Immutable::Hash
  .hash
    with nothing
      returns the canonical empty hash
    with an implicit hash
      is equivalent to repeatedly using #put
    with an array of pairs
      initializes a new Hash
    with an Immutable::Hash
      initializes an equivalent Hash

Immutable::Hash
  #dup
    returns self
  #clone
    returns self

Immutable::Hash
  #default_proc
    returns the default block given when the Hash was created
    returns nil if no default block was given
    after a key/val pair are inserted
      doesn't change
    after all key/val pairs are filtered out
      doesn't change
    after Hash is inverted
      doesn't change
    when a slice is taken
      doesn't change
    when keys are removed with #except
      doesn't change
    when Hash is mapped
      doesn't change
    when another Hash is merged in
      doesn't change

Immutable::Hash
  #delete
    with an existing key
      preserves the original
      returns a copy with the remaining key/value pairs
    with a non-existing key
      preserves the original values
      returns self
    when removing the last key
      from a Hash with no default block
        returns the canonical empty Hash

Immutable::Hash
  #dig
    returns the value with one argument to dig
    returns the value in nested hashes
    returns nil if the key is not present
    returns nil if you dig out the end of the hash
    raises a NoMethodError if a value does not support #dig
    returns the correct value when there is a default proc

Immutable::Hash
  #each
    with a block (internal iteration)
      returns self
      yields all key/value pairs
      yields key/value pairs in the same order as #each_key and #each_value
      yields both of a pair of colliding keys
      yields only the key to a block expecting |key,|
    with no block
      returns an Enumerator
  #each_pair
    with a block (internal iteration)
      returns self
      yields all key/value pairs
      yields key/value pairs in the same order as #each_key and #each_value
      yields both of a pair of colliding keys
      yields only the key to a block expecting |key,|
    with no block
      returns an Enumerator
  #each_key
    yields all keys
    with no block
      returns an Enumerator
  #each_value
    yields all values
    with no block
      returns an Enumerator

Immutable::Hash
  #each_with_index
    with a block (internal iteration)
      returns self
      yields all key/value pairs with numeric indexes
    with no block
      returns an Enumerator

Immutable::Hash
  #empty?
    returns true for []
    returns false for [{"A"=>"aye"}]
    returns false for [{"A"=>"aye", "B"=>"bee", "C"=>"see"}]
    returns true for empty hashes which have a default block
  .empty
    returns the canonical empty Hash
    from a subclass
      returns an empty instance of the subclass
      calls overridden #initialize when creating empty Hash

Immutable::Hash
  returns true on a large hash which is modified and then modified back again
  #eql?
    returns false when comparing with a standard hash
    returns false when comparing with an arbitrary object
    returns false when comparing with a subclass of Immutable::Hash
  #==
    returns true when comparing with a standard hash
    returns false when comparing with an arbitrary object
    returns true when comparing with a subclass of Immutable::Hash
    performs numeric conversions between floats and BigDecimals
  #eql?
    returns true
      for {} and {}
      for {} and {}
    returns false
      for {"A"=>"aye"} and {}
      for {} and {"A"=>"aye"}
    returns false
      for {} and {"A"=>"aye"}
      for {"A"=>"aye"} and {}
    returns true
      for {"A"=>"aye"} and {"A"=>"aye"}
      for {"A"=>"aye"} and {"A"=>"aye"}
    returns false
      for {"A"=>"aye"} and {"B"=>"bee"}
      for {"B"=>"bee"} and {"A"=>"aye"}
    returns false
      for {"A"=>"aye", "B"=>"bee"} and {"A"=>"aye"}
      for {"A"=>"aye"} and {"A"=>"aye", "B"=>"bee"}
    returns false
      for {"A"=>"aye"} and {"A"=>"aye", "B"=>"bee"}
      for {"A"=>"aye", "B"=>"bee"} and {"A"=>"aye"}
    returns true
      for {"A"=>"aye", "B"=>"bee", "C"=>"see"} and {"A"=>"aye", "B"=>"bee", "C"=>"see"}
      for {"A"=>"aye", "B"=>"bee", "C"=>"see"} and {"A"=>"aye", "B"=>"bee", "C"=>"see"}
    returns true
      for {"C"=>"see", "A"=>"aye", "B"=>"bee"} and {"A"=>"aye", "B"=>"bee", "C"=>"see"}
      for {"A"=>"aye", "B"=>"bee", "C"=>"see"} and {"C"=>"see", "A"=>"aye", "B"=>"bee"}
  #==
    returns true
      for {} and {}
      for {} and {}
    returns false
      for {"A"=>"aye"} and {}
      for {} and {"A"=>"aye"}
    returns false
      for {} and {"A"=>"aye"}
      for {"A"=>"aye"} and {}
    returns true
      for {"A"=>"aye"} and {"A"=>"aye"}
      for {"A"=>"aye"} and {"A"=>"aye"}
    returns false
      for {"A"=>"aye"} and {"B"=>"bee"}
      for {"B"=>"bee"} and {"A"=>"aye"}
    returns false
      for {"A"=>"aye", "B"=>"bee"} and {"A"=>"aye"}
      for {"A"=>"aye"} and {"A"=>"aye", "B"=>"bee"}
    returns false
      for {"A"=>"aye"} and {"A"=>"aye", "B"=>"bee"}
      for {"A"=>"aye", "B"=>"bee"} and {"A"=>"aye"}
    returns true
      for {"A"=>"aye", "B"=>"bee", "C"=>"see"} and {"A"=>"aye", "B"=>"bee", "C"=>"see"}
      for {"A"=>"aye", "B"=>"bee", "C"=>"see"} and {"A"=>"aye", "B"=>"bee", "C"=>"see"}
    returns true
      for {"C"=>"see", "A"=>"aye", "B"=>"bee"} and {"A"=>"aye", "B"=>"bee", "C"=>"see"}
      for {"A"=>"aye", "B"=>"bee", "C"=>"see"} and {"C"=>"see", "A"=>"aye", "B"=>"bee"}

Immutable::Hash
  #except
    works on a large Hash, with many combinations of input
    with only keys that the Hash has
      returns a Hash without those values
      doesn't change the original Hash
    with keys that the Hash doesn't have
      returns a Hash without the values that it had keys for
      doesn't change the original Hash

Immutable::Hash
  #fetch
    gives precedence to default block over default argument if passed both
    raises an ArgumentError when not passed one or 2 arguments
    with no default provided
      when the key exists
        returns the value associated with the key
      when the key does not exist
        raises a KeyError
    with a default value
      when the key exists
        returns the value associated with the key
      when the key does not exist
        returns the default value
    with a default block
      when the key exists
        returns the value associated with the key
      when the key does not exist
        invokes the default block with the missing key as paramter

Immutable::Hash
  #fetch_values
    when the all the requested keys exist
      returns a vector of values for the given keys
    when the key does not exist
      raises a KeyError

Immutable::Hash
  #find
    stops iterating when the block returns true
    on []
      with a block
        returns nil
      without a block
        returns an Enumerator
    on []
      with a block
        returns nil
      without a block
        returns an Enumerator
    on [{"A"=>"aye"}]
      with a block
        returns ["A", "aye"]
      without a block
        returns an Enumerator
    on [{"A"=>"aye"}]
      with a block
        returns nil
      without a block
        returns an Enumerator
    on [{"A"=>"aye"}]
      with a block
        returns nil
      without a block
        returns an Enumerator
    on [{"A"=>"aye", "B"=>"bee", nil=>"NIL"}]
      with a block
        returns ["A", "aye"]
      without a block
        returns an Enumerator
    on [{"A"=>"aye", "B"=>"bee", nil=>"NIL"}]
      with a block
        returns ["B", "bee"]
      without a block
        returns an Enumerator
    on [{"A"=>"aye", "B"=>"bee", nil=>"NIL"}]
      with a block
        returns [nil, "NIL"]
      without a block
        returns an Enumerator
    on [{"A"=>"aye", "B"=>"bee", nil=>"NIL"}]
      with a block
        returns nil
      without a block
        returns an Enumerator
  #detect
    stops iterating when the block returns true
    on []
      with a block
        returns nil
      without a block
        returns an Enumerator
    on []
      with a block
        returns nil
      without a block
        returns an Enumerator
    on [{"A"=>"aye"}]
      with a block
        returns ["A", "aye"]
      without a block
        returns an Enumerator
    on [{"A"=>"aye"}]
      with a block
        returns nil
      without a block
        returns an Enumerator
    on [{"A"=>"aye"}]
      with a block
        returns nil
      without a block
        returns an Enumerator
    on [{"A"=>"aye", "B"=>"bee", nil=>"NIL"}]
      with a block
        returns ["A", "aye"]
      without a block
        returns an Enumerator
    on [{"A"=>"aye", "B"=>"bee", nil=>"NIL"}]
      with a block
        returns ["B", "bee"]
      without a block
        returns an Enumerator
    on [{"A"=>"aye", "B"=>"bee", nil=>"NIL"}]
      with a block
        returns [nil, "NIL"]
      without a block
        returns an Enumerator
    on [{"A"=>"aye", "B"=>"bee", nil=>"NIL"}]
      with a block
        returns nil
      without a block
        returns an Enumerator

Immutable::Hash
  #flat_map
    yields each key/val pair
    returns the concatenation of block return values
    doesn't change the receiver
    returns an empty array if only empty arrays are returned by block
    with no block
      returns an Enumerator

Immutable::Hash
  #flatten
    with flatten depth of zero
      returns a vector of keys/value
    without array keys or values
      returns a vector of keys and values
      doesn't modify the receiver
    on an empty Hash
      returns an empty Vector
    with array keys
      flattens array keys into returned vector if flatten depth is sufficient
      doesn't modify the receiver (or its contents)
    with array values
      flattens array values into returned vector if flatten depth is sufficient
      doesn't modify the receiver (or its contents)
    with vector keys
      flattens vector keys into returned vector if flatten depth is sufficient
    with vector values
      flattens vector values into returned vector if flatten depth is sufficient

Immutable::Hash
  #get
    uses #hash to look up keys
    uses #eql? to compare keys with the same hash code
    does not use #eql? to compare keys with different hash codes
    with a default block
      when the key exists
        returns the value associated with the key
        does not call the default block even if the key is 'nil'
      when the key does not exist
        returns the value from the default block
    with no default block
      returns the value ("aye") for an existing key ("A")
      returns the value ("bee") for an existing key ("B")
      returns the value ("see") for an existing key ("C")
      returns the value ("NIL") for an existing key (nil)
      returns nil for a non-existing key
  #[]
    uses #hash to look up keys
    uses #eql? to compare keys with the same hash code
    does not use #eql? to compare keys with different hash codes
    with a default block
      when the key exists
        returns the value associated with the key
        does not call the default block even if the key is 'nil'
      when the key does not exist
        returns the value from the default block
    with no default block
      returns the value ("aye") for an existing key ("A")
      returns the value ("bee") for an existing key ("B")
      returns the value ("see") for an existing key ("C")
      returns the value ("NIL") for an existing key (nil)
      returns nil for a non-existing key

Immutable::Hash
  #key?
    returns true for an existing key ("A")
    returns true for an existing key ("B")
    returns true for an existing key ("C")
    returns true for an existing key (nil)
    returns true for an existing key (2.0)
    returns false for a non-existing key
    uses #eql? for equality
    returns true if the key is found and maps to nil
    returns true if the key is found and maps to false
  #has_key?
    returns true for an existing key ("A")
    returns true for an existing key ("B")
    returns true for an existing key ("C")
    returns true for an existing key (nil)
    returns true for an existing key (2.0)
    returns false for a non-existing key
    uses #eql? for equality
    returns true if the key is found and maps to nil
    returns true if the key is found and maps to false
  #include?
    returns true for an existing key ("A")
    returns true for an existing key ("B")
    returns true for an existing key ("C")
    returns true for an existing key (nil)
    returns true for an existing key (2.0)
    returns false for a non-existing key
    uses #eql? for equality
    returns true if the key is found and maps to nil
    returns true if the key is found and maps to false
  #member?
    returns true for an existing key ("A")
    returns true for an existing key ("B")
    returns true for an existing key ("C")
    returns true for an existing key (nil)
    returns true for an existing key (2.0)
    returns false for a non-existing key
    uses #eql? for equality
    returns true if the key is found and maps to nil
    returns true if the key is found and maps to false

Immutable::Hash
  #value?
    returns true if any key/val pair in Hash has the same value
    returns false if no key/val pair in Hash has the same value
    uses #== to check equality
    works on a large hash
  #has_value?
    returns true if any key/val pair in Hash has the same value
    returns false if no key/val pair in Hash has the same value
    uses #== to check equality
    works on a large hash

Immutable::Hash
  #hash
    values are sufficiently distributed
    differs given the same keys and different values
    differs given the same values and different keys
    generates the same hash value for a hash regardless of the order things were added to it
    on an empty hash
      returns 0

Immutable::Hash
  #inspect
    on []
      returns "Immutable::Hash[]"
    on [{"A"=>"aye"}]
      returns "Immutable::Hash[\"A\" => \"aye\"]"
    on [{"A"=>"aye", "B"=>"bee", "C"=>"see"}]
      returns "Immutable::Hash[\"A\" => \"aye\", \"B\" => \"bee\", \"C\" => \"see\"]"
    on {}
      returns a string which can be eval'd to get an equivalent object
    on {"A"=>"aye"}
      returns a string which can be eval'd to get an equivalent object
    on {:a=>"aye", :b=>"bee", :c=>"see"}
      returns a string which can be eval'd to get an equivalent object

Immutable::Hash
  #invert
    uses the existing keys as values and values as keys
    will select one key/value pair among multiple which have same value
    doesn't change the original Hash
    from a subclass of Hash
      returns an instance of the subclass

Immutable::Hash
  #key
    returns a key associated with the given value, if there is one
    returns nil if there is no key associated with the given value
    uses #== to compare values for equality
    doesn't use default block if value is not found

Immutable::Hash
  #keys
    returns the keys as a set
    returns frozen String keys

Immutable::Hash
  #map
    when empty
      returns self
    when not empty
      with a block
        preserves the original values
        returns a new hash with the mapped values
      with no block
        returns an Enumerator
    from a subclass
      returns an instance of the subclass
  #collect
    when empty
      returns self
    when not empty
      with a block
        preserves the original values
        returns a new hash with the mapped values
      with no block
        returns an Enumerator
    from a subclass
      returns an instance of the subclass

Immutable::Hash
  #marshal_dump/#marshal_load
    can survive dumping and loading into a new process
    is still possible to find items by key after loading

Immutable::Hash
  #merge
    sets any duplicate key to the value of block if passed a block
    yields key/value pairs in the same order as #each
    for {} and {}
      returns {} when passed an Immutable::Hash
      returns {} when passed a Ruby Hash
      doesn't change the original Hashes
    for {"A"=>"aye"} and {}
      returns {"A"=>"aye"} when passed an Immutable::Hash
      returns {"A"=>"aye"} when passed a Ruby Hash
      doesn't change the original Hashes
    for {"A"=>"aye"} and {"A"=>"bee"}
      returns {"A"=>"bee"} when passed an Immutable::Hash
      returns {"A"=>"bee"} when passed a Ruby Hash
      doesn't change the original Hashes
    for {"A"=>"aye"} and {"B"=>"bee"}
      returns {"A"=>"aye", "B"=>"bee"} when passed an Immutable::Hash
      returns {"A"=>"aye", "B"=>"bee"} when passed a Ruby Hash
      doesn't change the original Hashes
    for [[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6], [7, 7], [8, 8], [9, 9], [10, 10], [11, 11], [12, 12], [13, 13], [14, 14], [15, 15], [16, 16], [17, 17], [18, 18], [19, 19], [20, 20], [21, 21], [22, 22], [23, 23], [24, 24], [25, 25], [26, 26], [27, 27], [28, 28], [29, 29], [30, 30], [31, 31], [32, 32], [33, 33], [34, 34], [35, 35], [36, 36], [37, 37], [38, 38], [39, 39], [40, 40], [41, 41], [42, 42], [43, 43], [44, 44], [45, 45], [46, 46], [47, 47], [48, 48], [49, 49], [50, 50], [51, 51], [52, 52], [53, 53], [54, 54], [55, 55], [56, 56], [57, 57], [58, 58], [59, 59], [60, 60], [61, 61], [62, 62], [63, 63], [64, 64], [65, 65], [66, 66], [67, 67], [68, 68], [69, 69], [70, 70], [71, 71], [72, 72], [73, 73], [74, 74], [75, 75], [76, 76], [77, 77], [78, 78], [79, 79], [80, 80], [81, 81], [82, 82], [83, 83], [84, 84], [85, 85], [86, 86], [87, 87], [88, 88], [89, 89], [90, 90], [91, 91], [92, 92], [93, 93], [94, 94], [95, 95], [96, 96], [97, 97], [98, 98], [99, 99], [100, 100], [101, 101], [102, 102], [103, 103], [104, 104], [105, 105], [106, 106], [107, 107], [108, 108], [109, 109], [110, 110], [111, 111], [112, 112], [113, 113], [114, 114], [115, 115], [116, 116], [117, 117], [118, 118], [119, 119], [120, 120], [121, 121], [122, 122], [123, 123], [124, 124], [125, 125], [126, 126], [127, 127], [128, 128], [129, 129], [130, 130], [131, 131], [132, 132], [133, 133], [134, 134], [135, 135], [136, 136], [137, 137], [138, 138], [139, 139], [140, 140], [141, 141], [142, 142], [143, 143], [144, 144], [145, 145], [146, 146], [147, 147], [148, 148], [149, 149], [150, 150], [151, 151], [152, 152], [153, 153], [154, 154], [155, 155], [156, 156], [157, 157], [158, 158], [159, 159], [160, 160], [161, 161], [162, 162], [163, 163], [164, 164], [165, 165], [166, 166], [167, 167], [168, 168], [169, 169], [170, 170], [171, 171], [172, 172], [173, 173], [174, 174], [175, 175], [176, 176], [177, 177], [178, 178], [179, 179], [180, 180], [181, 181], [182, 182], [183, 183], [184, 184], [185, 185], [186, 186], [187, 187], [188, 188], [189, 189], [190, 190], [191, 191], [192, 192], [193, 193], [194, 194], [195, 195], [196, 196], [197, 197], [198, 198], [199, 199], [200, 200], [201, 201], [202, 202], [203, 203], [204, 204], [205, 205], [206, 206], [207, 207], [208, 208], [209, 209], [210, 210], [211, 211], [212, 212], [213, 213], [214, 214], [215, 215], [216, 216], [217, 217], [218, 218], [219, 219], [220, 220], [221, 221], [222, 222], [223, 223], [224, 224], [225, 225], [226, 226], [227, 227], [228, 228], [229, 229], [230, 230], [231, 231], [232, 232], [233, 233], [234, 234], [235, 235], [236, 236], [237, 237], [238, 238], [239, 239], [240, 240], [241, 241], [242, 242], [243, 243], [244, 244], [245, 245], [246, 246], [247, 247], [248, 248], [249, 249], [250, 250], [251, 251], [252, 252], [253, 253], [254, 254], [255, 255], [256, 256], [257, 257], [258, 258], [259, 259], [260, 260], [261, 261], [262, 262], [263, 263], [264, 264], [265, 265], [266, 266], [267, 267], [268, 268], [269, 269], [270, 270], [271, 271], [272, 272], [273, 273], [274, 274], [275, 275], [276, 276], [277, 277], [278, 278], [279, 279], [280, 280], [281, 281], [282, 282], [283, 283], [284, 284], [285, 285], [286, 286], [287, 287], [288, 288], [289, 289], [290, 290], [291, 291], [292, 292], [293, 293], [294, 294], [295, 295], [296, 296], [297, 297], [298, 298], [299, 299], [300, 300]] and [[150, 150], [151, 151], [152, 152], [153, 153], [154, 154], [155, 155], [156, 156], [157, 157], [158, 158], [159, 159], [160, 160], [161, 161], [162, 162], [163, 163], [164, 164], [165, 165], [166, 166], [167, 167], [168, 168], [169, 169], [170, 170], [171, 171], [172, 172], [173, 173], [174, 174], [175, 175], [176, 176], [177, 177], [178, 178], [179, 179], [180, 180], [181, 181], [182, 182], [183, 183], [184, 184], [185, 185], [186, 186], [187, 187], [188, 188], [189, 189], [190, 190], [191, 191], [192, 192], [193, 193], [194, 194], [195, 195], [196, 196], [197, 197], [198, 198], [199, 199], [200, 200], [201, 201], [202, 202], [203, 203], [204, 204], [205, 205], [206, 206], [207, 207], [208, 208], [209, 209], [210, 210], [211, 211], [212, 212], [213, 213], [214, 214], [215, 215], [216, 216], [217, 217], [218, 218], [219, 219], [220, 220], [221, 221], [222, 222], [223, 223], [224, 224], [225, 225], [226, 226], [227, 227], [228, 228], [229, 229], [230, 230], [231, 231], [232, 232], [233, 233], [234, 234], [235, 235], [236, 236], [237, 237], [238, 238], [239, 239], [240, 240], [241, 241], [242, 242], [243, 243], [244, 244], [245, 245], [246, 246], [247, 247], [248, 248], [249, 249], [250, 250], [251, 251], [252, 252], [253, 253], [254, 254], [255, 255], [256, 256], [257, 257], [258, 258], [259, 259], [260, 260], [261, 261], [262, 262], [263, 263], [264, 264], [265, 265], [266, 266], [267, 267], [268, 268], [269, 269], [270, 270], [271, 271], [272, 272], [273, 273], [274, 274], [275, 275], [276, 276], [277, 277], [278, 278], [279, 279], [280, 280], [281, 281], [282, 282], [283, 283], [284, 284], [285, 285], [286, 286], [287, 287], [288, 288], [289, 289], [290, 290], [291, 291], [292, 292], [293, 293], [294, 294], [295, 295], [296, 296], [297, 297], [298, 298], [299, 299], [300, 300], [301, 301], [302, 302], [303, 303], [304, 304], [305, 305], [306, 306], [307, 307], [308, 308], [309, 309], [310, 310], [311, 311], [312, 312], [313, 313], [314, 314], [315, 315], [316, 316], [317, 317], [318, 318], [319, 319], [320, 320], [321, 321], [322, 322], [323, 323], [324, 324], [325, 325], [326, 326], [327, 327], [328, 328], [329, 329], [330, 330], [331, 331], [332, 332], [333, 333], [334, 334], [335, 335], [336, 336], [337, 337], [338, 338], [339, 339], [340, 340], [341, 341], [342, 342], [343, 343], [344, 344], [345, 345], [346, 346], [347, 347], [348, 348], [349, 349], [350, 350], [351, 351], [352, 352], [353, 353], [354, 354], [355, 355], [356, 356], [357, 357], [358, 358], [359, 359], [360, 360], [361, 361], [362, 362], [363, 363], [364, 364], [365, 365], [366, 366], [367, 367], [368, 368], [369, 369], [370, 370], [371, 371], [372, 372], [373, 373], [374, 374], [375, 375], [376, 376], [377, 377], [378, 378], [379, 379], [380, 380], [381, 381], [382, 382], [383, 383], [384, 384], [385, 385], [386, 386], [387, 387], [388, 388], [389, 389], [390, 390], [391, 391], [392, 392], [393, 393], [394, 394], [395, 395], [396, 396], [397, 397], [398, 398], [399, 399], [400, 400], [401, 401], [402, 402], [403, 403], [404, 404], [405, 405], [406, 406], [407, 407], [408, 408], [409, 409], [410, 410], [411, 411], [412, 412], [413, 413], [414, 414], [415, 415], [416, 416], [417, 417], [418, 418], [419, 419], [420, 420], [421, 421], [422, 422], [423, 423], [424, 424], [425, 425], [426, 426], [427, 427], [428, 428], [429, 429], [430, 430], [431, 431], [432, 432], [433, 433], [434, 434], [435, 435], [436, 436], [437, 437], [438, 438], [439, 439], [440, 440], [441, 441], [442, 442], [443, 443], [444, 444], [445, 445], [446, 446], [447, 447], [448, 448], [449, 449], [450, 450]]
      returns [[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6], [7, 7], [8, 8], [9, 9], [10, 10], [11, 11], [12, 12], [13, 13], [14, 14], [15, 15], [16, 16], [17, 17], [18, 18], [19, 19], [20, 20], [21, 21], [22, 22], [23, 23], [24, 24], [25, 25], [26, 26], [27, 27], [28, 28], [29, 29], [30, 30], [31, 31], [32, 32], [33, 33], [34, 34], [35, 35], [36, 36], [37, 37], [38, 38], [39, 39], [40, 40], [41, 41], [42, 42], [43, 43], [44, 44], [45, 45], [46, 46], [47, 47], [48, 48], [49, 49], [50, 50], [51, 51], [52, 52], [53, 53], [54, 54], [55, 55], [56, 56], [57, 57], [58, 58], [59, 59], [60, 60], [61, 61], [62, 62], [63, 63], [64, 64], [65, 65], [66, 66], [67, 67], [68, 68], [69, 69], [70, 70], [71, 71], [72, 72], [73, 73], [74, 74], [75, 75], [76, 76], [77, 77], [78, 78], [79, 79], [80, 80], [81, 81], [82, 82], [83, 83], [84, 84], [85, 85], [86, 86], [87, 87], [88, 88], [89, 89], [90, 90], [91, 91], [92, 92], [93, 93], [94, 94], [95, 95], [96, 96], [97, 97], [98, 98], [99, 99], [100, 100], [101, 101], [102, 102], [103, 103], [104, 104], [105, 105], [106, 106], [107, 107], [108, 108], [109, 109], [110, 110], [111, 111], [112, 112], [113, 113], [114, 114], [115, 115], [116, 116], [117, 117], [118, 118], [119, 119], [120, 120], [121, 121], [122, 122], [123, 123], [124, 124], [125, 125], [126, 126], [127, 127], [128, 128], [129, 129], [130, 130], [131, 131], [132, 132], [133, 133], [134, 134], [135, 135], [136, 136], [137, 137], [138, 138], [139, 139], [140, 140], [141, 141], [142, 142], [143, 143], [144, 144], [145, 145], [146, 146], [147, 147], [148, 148], [149, 149], [150, 150], [151, 151], [152, 152], [153, 153], [154, 154], [155, 155], [156, 156], [157, 157], [158, 158], [159, 159], [160, 160], [161, 161], [162, 162], [163, 163], [164, 164], [165, 165], [166, 166], [167, 167], [168, 168], [169, 169], [170, 170], [171, 171], [172, 172], [173, 173], [174, 174], [175, 175], [176, 176], [177, 177], [178, 178], [179, 179], [180, 180], [181, 181], [182, 182], [183, 183], [184, 184], [185, 185], [186, 186], [187, 187], [188, 188], [189, 189], [190, 190], [191, 191], [192, 192], [193, 193], [194, 194], [195, 195], [196, 196], [197, 197], [198, 198], [199, 199], [200, 200], [201, 201], [202, 202], [203, 203], [204, 204], [205, 205], [206, 206], [207, 207], [208, 208], [209, 209], [210, 210], [211, 211], [212, 212], [213, 213], [214, 214], [215, 215], [216, 216], [217, 217], [218, 218], [219, 219], [220, 220], [221, 221], [222, 222], [223, 223], [224, 224], [225, 225], [226, 226], [227, 227], [228, 228], [229, 229], [230, 230], [231, 231], [232, 232], [233, 233], [234, 234], [235, 235], [236, 236], [237, 237], [238, 238], [239, 239], [240, 240], [241, 241], [242, 242], [243, 243], [244, 244], [245, 245], [246, 246], [247, 247], [248, 248], [249, 249], [250, 250], [251, 251], [252, 252], [253, 253], [254, 254], [255, 255], [256, 256], [257, 257], [258, 258], [259, 259], [260, 260], [261, 261], [262, 262], [263, 263], [264, 264], [265, 265], [266, 266], [267, 267], [268, 268], [269, 269], [270, 270], [271, 271], [272, 272], [273, 273], [274, 274], [275, 275], [276, 276], [277, 277], [278, 278], [279, 279], [280, 280], [281, 281], [282, 282], [283, 283], [284, 284], [285, 285], [286, 286], [287, 287], [288, 288], [289, 289], [290, 290], [291, 291], [292, 292], [293, 293], [294, 294], [295, 295], [296, 296], [297, 297], [298, 298], [299, 299], [300, 300], [301, 301], [302, 302], [303, 303], [304, 304], [305, 305], [306, 306], [307, 307], [308, 308], [309, 309], [310, 310], [311, 311], [312, 312], [313, 313], [314, 314], [315, 315], [316, 316], [317, 317], [318, 318], [319, 319], [320, 320], [321, 321], [322, 322], [323, 323], [324, 324], [325, 325], [326, 326], [327, 327], [328, 328], [329, 329], [330, 330], [331, 331], [332, 332], [333, 333], [334, 334], [335, 335], [336, 336], [337, 337], [338, 338], [339, 339], [340, 340], [341, 341], [342, 342], [343, 343], [344, 344], [345, 345], [346, 346], [347, 347], [348, 348], [349, 349], [350, 350], [351, 351], [352, 352], [353, 353], [354, 354], [355, 355], [356, 356], [357, 357], [358, 358], [359, 359], [360, 360], [361, 361], [362, 362], [363, 363], [364, 364], [365, 365], [366, 366], [367, 367], [368, 368], [369, 369], [370, 370], [371, 371], [372, 372], [373, 373], [374, 374], [375, 375], [376, 376], [377, 377], [378, 378], [379, 379], [380, 380], [381, 381], [382, 382], [383, 383], [384, 384], [385, 385], [386, 386], [387, 387], [388, 388], [389, 389], [390, 390], [391, 391], [392, 392], [393, 393], [394, 394], [395, 395], [396, 396], [397, 397], [398, 398], [399, 399], [400, 400], [401, 401], [402, 402], [403, 403], [404, 404], [405, 405], [406, 406], [407, 407], [408, 408], [409, 409], [410, 410], [411, 411], [412, 412], [413, 413], [414, 414], [415, 415], [416, 416], [417, 417], [418, 418], [419, 419], [420, 420], [421, 421], [422, 422], [423, 423], [424, 424], [425, 425], [426, 426], [427, 427], [428, 428], [429, 429], [430, 430], [431, 431], [432, 432], [433, 433], [434, 434], [435, 435], [436, 436], [437, 437], [438, 438], [439, 439], [440, 440], [441, 441], [442, 442], [443, 443], [444, 444], [445, 445], [446, 446], [447, 447], [448, 448], [449, 449], [450, 450]] when passed an Immutable::Hash
      returns [[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6], [7, 7], [8, 8], [9, 9], [10, 10], [11, 11], [12, 12], [13, 13], [14, 14], [15, 15], [16, 16], [17, 17], [18, 18], [19, 19], [20, 20], [21, 21], [22, 22], [23, 23], [24, 24], [25, 25], [26, 26], [27, 27], [28, 28], [29, 29], [30, 30], [31, 31], [32, 32], [33, 33], [34, 34], [35, 35], [36, 36], [37, 37], [38, 38], [39, 39], [40, 40], [41, 41], [42, 42], [43, 43], [44, 44], [45, 45], [46, 46], [47, 47], [48, 48], [49, 49], [50, 50], [51, 51], [52, 52], [53, 53], [54, 54], [55, 55], [56, 56], [57, 57], [58, 58], [59, 59], [60, 60], [61, 61], [62, 62], [63, 63], [64, 64], [65, 65], [66, 66], [67, 67], [68, 68], [69, 69], [70, 70], [71, 71], [72, 72], [73, 73], [74, 74], [75, 75], [76, 76], [77, 77], [78, 78], [79, 79], [80, 80], [81, 81], [82, 82], [83, 83], [84, 84], [85, 85], [86, 86], [87, 87], [88, 88], [89, 89], [90, 90], [91, 91], [92, 92], [93, 93], [94, 94], [95, 95], [96, 96], [97, 97], [98, 98], [99, 99], [100, 100], [101, 101], [102, 102], [103, 103], [104, 104], [105, 105], [106, 106], [107, 107], [108, 108], [109, 109], [110, 110], [111, 111], [112, 112], [113, 113], [114, 114], [115, 115], [116, 116], [117, 117], [118, 118], [119, 119], [120, 120], [121, 121], [122, 122], [123, 123], [124, 124], [125, 125], [126, 126], [127, 127], [128, 128], [129, 129], [130, 130], [131, 131], [132, 132], [133, 133], [134, 134], [135, 135], [136, 136], [137, 137], [138, 138], [139, 139], [140, 140], [141, 141], [142, 142], [143, 143], [144, 144], [145, 145], [146, 146], [147, 147], [148, 148], [149, 149], [150, 150], [151, 151], [152, 152], [153, 153], [154, 154], [155, 155], [156, 156], [157, 157], [158, 158], [159, 159], [160, 160], [161, 161], [162, 162], [163, 163], [164, 164], [165, 165], [166, 166], [167, 167], [168, 168], [169, 169], [170, 170], [171, 171], [172, 172], [173, 173], [174, 174], [175, 175], [176, 176], [177, 177], [178, 178], [179, 179], [180, 180], [181, 181], [182, 182], [183, 183], [184, 184], [185, 185], [186, 186], [187, 187], [188, 188], [189, 189], [190, 190], [191, 191], [192, 192], [193, 193], [194, 194], [195, 195], [196, 196], [197, 197], [198, 198], [199, 199], [200, 200], [201, 201], [202, 202], [203, 203], [204, 204], [205, 205], [206, 206], [207, 207], [208, 208], [209, 209], [210, 210], [211, 211], [212, 212], [213, 213], [214, 214], [215, 215], [216, 216], [217, 217], [218, 218], [219, 219], [220, 220], [221, 221], [222, 222], [223, 223], [224, 224], [225, 225], [226, 226], [227, 227], [228, 228], [229, 229], [230, 230], [231, 231], [232, 232], [233, 233], [234, 234], [235, 235], [236, 236], [237, 237], [238, 238], [239, 239], [240, 240], [241, 241], [242, 242], [243, 243], [244, 244], [245, 245], [246, 246], [247, 247], [248, 248], [249, 249], [250, 250], [251, 251], [252, 252], [253, 253], [254, 254], [255, 255], [256, 256], [257, 257], [258, 258], [259, 259], [260, 260], [261, 261], [262, 262], [263, 263], [264, 264], [265, 265], [266, 266], [267, 267], [268, 268], [269, 269], [270, 270], [271, 271], [272, 272], [273, 273], [274, 274], [275, 275], [276, 276], [277, 277], [278, 278], [279, 279], [280, 280], [281, 281], [282, 282], [283, 283], [284, 284], [285, 285], [286, 286], [287, 287], [288, 288], [289, 289], [290, 290], [291, 291], [292, 292], [293, 293], [294, 294], [295, 295], [296, 296], [297, 297], [298, 298], [299, 299], [300, 300], [301, 301], [302, 302], [303, 303], [304, 304], [305, 305], [306, 306], [307, 307], [308, 308], [309, 309], [310, 310], [311, 311], [312, 312], [313, 313], [314, 314], [315, 315], [316, 316], [317, 317], [318, 318], [319, 319], [320, 320], [321, 321], [322, 322], [323, 323], [324, 324], [325, 325], [326, 326], [327, 327], [328, 328], [329, 329], [330, 330], [331, 331], [332, 332], [333, 333], [334, 334], [335, 335], [336, 336], [337, 337], [338, 338], [339, 339], [340, 340], [341, 341], [342, 342], [343, 343], [344, 344], [345, 345], [346, 346], [347, 347], [348, 348], [349, 349], [350, 350], [351, 351], [352, 352], [353, 353], [354, 354], [355, 355], [356, 356], [357, 357], [358, 358], [359, 359], [360, 360], [361, 361], [362, 362], [363, 363], [364, 364], [365, 365], [366, 366], [367, 367], [368, 368], [369, 369], [370, 370], [371, 371], [372, 372], [373, 373], [374, 374], [375, 375], [376, 376], [377, 377], [378, 378], [379, 379], [380, 380], [381, 381], [382, 382], [383, 383], [384, 384], [385, 385], [386, 386], [387, 387], [388, 388], [389, 389], [390, 390], [391, 391], [392, 392], [393, 393], [394, 394], [395, 395], [396, 396], [397, 397], [398, 398], [399, 399], [400, 400], [401, 401], [402, 402], [403, 403], [404, 404], [405, 405], [406, 406], [407, 407], [408, 408], [409, 409], [410, 410], [411, 411], [412, 412], [413, 413], [414, 414], [415, 415], [416, 416], [417, 417], [418, 418], [419, 419], [420, 420], [421, 421], [422, 422], [423, 423], [424, 424], [425, 425], [426, 426], [427, 427], [428, 428], [429, 429], [430, 430], [431, 431], [432, 432], [433, 433], [434, 434], [435, 435], [436, 436], [437, 437], [438, 438], [439, 439], [440, 440], [441, 441], [442, 442], [443, 443], [444, 444], [445, 445], [446, 446], [447, 447], [448, 448], [449, 449], [450, 450]] when passed a Ruby Hash
      doesn't change the original Hashes
    when merging with an empty Hash
      returns self
    when merging with subset Hash
      returns self
    when called on a subclass
      returns an instance of the subclass

Immutable::Hash
  #min
    returns the smallest key/val pair
  #max
    returns the largest key/val pair
  #min_by
    returns the smallest key/val pair (after passing it through a key function)
    returns the first key/val pair yielded by #each in case of a tie
    returns nil if the hash is empty
  #max_by
    returns the largest key/val pair (after passing it through a key function)
    returns the first key/val pair yielded by #each in case of a tie
    returns nil if the hash is empty

Immutable::Hash
  .new
    is amenable to overriding of #initialize
    accepts an array as initializer
    returns a Hash which doesn't change even if initializer is mutated
    from a subclass
      returns a frozen instance of the subclass
  .[]
    accepts a Ruby Hash as initializer
    accepts a Immutable::Hash as initializer
    accepts an array as initializer
    can be used with a subclass of Immutable::Hash

Immutable::Hash
  #none?
    when empty
      with a block returns true
      with no block returns true
    when not empty
      with a block
        returns false if the block ever returns true (["A", "aye"])
        returns true if the block always returns false
        stops iterating as soon as the block returns true
        returns false if the block ever returns true (["B", "bee"])
        returns true if the block always returns false
        stops iterating as soon as the block returns true
        returns false if the block ever returns true (["C", "see"])
        returns true if the block always returns false
        stops iterating as soon as the block returns true
        returns false if the block ever returns true ([nil, "NIL"])
        returns true if the block always returns false
        stops iterating as soon as the block returns true
      with no block
        returns false

Immutable::Hash
  #partition
    returns a pair of Immutable::Hashes
    returns key/val pairs for which predicate is true in first Hash
    returns key/val pairs for which predicate is false in second Hash
    doesn't modify the original Hash
    from a subclass
      should return instances of the subclass

Immutable::Hash
  #pretty_print
    prints the whole Hash on one line if it fits
    prints each key/val pair on its own line, if not
    prints keys and vals on separate lines, if space is very tight

Immutable::Hash
  #[]=
    raises error pointing to #put
  #put
    with a block
      passes the value to the block
      replaces the value with the result of the block
      supports to_proc methods
      if there is no existing association
        passes nil to the block
        stores the result of the block as the new value
    with a unique key
      preserves the original
      returns a copy with the superset of key/value pairs
    with a duplicate key
      preserves the original
      returns a copy with the superset of key/value pairs
    with duplicate key and identical value
      returns the original hash unmodified
      with big hash (force nested tries)
        returns the original hash unmodified for all changes
    with unequal keys which hash to the same value
      stores and can retrieve both
    when a String is inserted as key and then mutated
      is not affected

Immutable::Hash
  #reduce
    when empty
      returns the memo
    when not empty
      with a block
        returns the final memo
      with no block
        uses a passed string as the name of a method to use instead
        uses a passed symbol as the name of a method to use instead
  #inject
    when empty
      returns the memo
    when not empty
      with a block
        returns the final memo
      with no block
        uses a passed string as the name of a method to use instead
        uses a passed symbol as the name of a method to use instead

Immutable::Hash
  #reject
    when nothing matches
      returns self
    when only some things match
      with a block
        preserves the original
        returns a set with the matching values
        yields entries in the same order as #each
      with no block
        returns an Enumerator
      on a large hash, with many combinations of input
        still works
  #delete_if
    when nothing matches
      returns self
    when only some things match
      with a block
        preserves the original
        returns a set with the matching values
        yields entries in the same order as #each
      with no block
        returns an Enumerator
      on a large hash, with many combinations of input
        still works

Immutable::Hash
  #reverse_each
    with a block
      returns self
      yields all key/value pairs in the opposite order as #each
    with no block
      returns an Enumerator

Immutable::Hash
  #sample
    returns a randomly chosen item

Immutable::Hash
  #select
    works on a large hash, with many combinations of input
    when everything matches
      returns self
    when only some things match
      yields entries as [key, value] pairs
      with a block
        preserves the original
        returns a set with the matching values
      with no block
        returns an Enumerator
  #find_all
    works on a large hash, with many combinations of input
    when everything matches
      returns self
    when only some things match
      yields entries as [key, value] pairs
      with a block
        preserves the original
        returns a set with the matching values
      with no block
        returns an Enumerator
  #keep_if
    works on a large hash, with many combinations of input
    when everything matches
      returns self
    when only some things match
      yields entries as [key, value] pairs
      with a block
        preserves the original
        returns a set with the matching values
      with no block
        returns an Enumerator

Immutable::Hash
  #size
    returns 0 for []
    returns 1 for [{"A"=>"aye"}]
    returns 3 for [{"A"=>"bee", "B"=>"bee", "C"=>"see"}]
    has the correct size after adding lots of things with colliding keys and such
    has the correct size after lots of addings and removings
  #length
    returns 0 for []
    returns 1 for [{"A"=>"aye"}]
    returns 3 for [{"A"=>"bee", "B"=>"bee", "C"=>"see"}]
    has the correct size after adding lots of things with colliding keys and such
    has the correct size after lots of addings and removings

Immutable::Hash
  #slice
    with all keys present in the Hash
      returns the sliced values
      doesn't modify the original Hash
    with keys aren't present in the Hash
      returns the sliced values of the matching keys
      doesn't modify the original Hash
    on a Hash with a default block
      maintains the default block

Immutable::Hash
  #sort
    returns a Vector of sorted key/val pairs
    works on large hashes
    uses block as comparator to sort if passed a block
  #sort_by
    returns a Vector of key/val pairs, sorted using the block as a key function

Immutable::Hash
  #store
    with a unique key
      preserves the original
      returns a copy with the superset of key/value pairs
    with a duplicate key
      preserves the original
      returns a copy with the superset of key/value pairs
    with duplicate key and identical value
      returns the original hash unmodified
      with big hash (force nested tries)
        returns the original hash unmodified for all changes
    with unequal keys which hash to the same value
      stores and can retrieve both
    when a String is inserted as key and then mutated
      is not affected

Immutable::Hash
  #<=
    for {} and {}
      returns true
    for {"A"=>1} and {}
      returns false
    for {} and {"A"=>1}
      returns true
    for {"A"=>1} and {"A"=>1}
      returns true
    for {"A"=>1} and {"A"=>2}
      returns false
    for {"B"=>2} and {"A"=>1, "B"=>2, "C"=>3}
      returns true
    for {"A"=>1, "B"=>2, "C"=>3} and {"B"=>2}
      returns false
    for {"B"=>0} and {"A"=>1, "B"=>2, "C"=>3}
      returns false
  #<
    for {} and {}
      returns false
    for {"A"=>1} and {}
      returns false
    for {} and {"A"=>1}
      returns true
    for {"A"=>1} and {"A"=>1}
      returns false
    for {"A"=>1} and {"A"=>2}
      returns false
    for {"B"=>2} and {"A"=>1, "B"=>2, "C"=>3}
      returns true
    for {"A"=>1, "B"=>2, "C"=>3} and {"B"=>2}
      returns false
    for {"B"=>0} and {"A"=>1, "B"=>2, "C"=>3}
      returns false

Immutable::Hash
  #>=
    for {} and {}
      returns true
    for {"A"=>1} and {}
      returns true
    for {} and {"A"=>1}
      returns false
    for {"A"=>1} and {"A"=>1}
      returns true
    for {"A"=>1} and {"A"=>2}
      returns false
    for {"A"=>1, "B"=>2, "C"=>3} and {"B"=>2}
      returns true
    for {"B"=>2} and {"A"=>1, "B"=>2, "C"=>3}
      returns false
    for {"A"=>1, "B"=>2, "C"=>3} and {"B"=>0}
      returns false
  #>
    for {} and {}
      returns false
    for {"A"=>1} and {}
      returns true
    for {} and {"A"=>1}
      returns false
    for {"A"=>1} and {"A"=>1}
      returns false
    for {"A"=>1} and {"A"=>2}
      returns false
    for {"A"=>1, "B"=>2, "C"=>3} and {"B"=>2}
      returns true
    for {"B"=>2} and {"A"=>1, "B"=>2, "C"=>3}
      returns false
    for {"A"=>1, "B"=>2, "C"=>3} and {"B"=>0}
      returns false

Immutable::Hash
  #take
    returns the first N key/val pairs from hash
  #take_while
    passes elements to the block until the block returns nil/false
    returns an array of all elements before the one which returned nil/false
    passes all elements if the block never returns nil/false

Immutable::Hash
  #to_a
    returns an Array of [key, value] pairs in same order as #each

Immutable::Hash
  #to_hash
    converts an empty Immutable::Hash to an empty Ruby Hash
    converts a non-empty Immutable::Hash to a Hash with the same keys and values
    doesn't modify the receiver
  #to_h
    converts an empty Immutable::Hash to an empty Ruby Hash
    converts a non-empty Immutable::Hash to a Hash with the same keys and values
    doesn't modify the receiver

Immutable::Hash
  #to_proc
    on Hash without default proc
      returns a Proc instance
      returns a Proc that returns the value of an existing key
      returns a Proc that returns nil for a missing key
    on Hash with a default proc
      returns a Proc instance
      returns a Proc that returns the value of an existing key
      returns a Proc that returns the result of the hash's default proc for a missing key

Immutable::Hash
  #update_in
    with one level on existing key
      passes the value to the block
      replaces the value with the result of the block
      should preserve the original
    with multi-level on existing keys
      passes the value to the block
      replaces the value with the result of the block
      should preserve the original
    with multi-level creating sub-hashes when keys don't exist
      passes nil to the block
      creates subhashes on the way to set the value
    with multi-level including vector with existing keys
      passes the value to the block
      replaces the value with the result of the block
      should preserve the original
    with empty key_path
      raises ArguemntError

Immutable::Hash
  #values_at
    on Hash without default proc
      returns an empty vector when no keys are given
      returns a vector of values for the given keys
      fills nil when keys are missing
    on Hash with default proc
      fills the result of the default proc when keys are missing

Immutable::Hash
  #values
    returns the keys as a Vector
    with duplicates
      returns the keys as a Vector

Immutable::List
  #add
    on [] with "A"
      preserves the original
      returns ["A"]
    on ["A"] with "B"
      preserves the original
      returns ["B", "A"]
    on ["A"] with "A"
      preserves the original
      returns ["A", "A"]
    on ["A", "B", "C"] with "D"
      preserves the original
      returns ["D", "A", "B", "C"]

Immutable::List
  #all?
    on a really big list
      doesn't run out of stack
    when empty
      with a block returns true
      with no block returns true
    when not empty
      with a block
        if the block always returns true
          returns true
        if the block ever returns false
          returns false
      with no block
        if all values are truthy
          returns true
        if any value is nil
          returns false
        if any value is false
          returns false

Immutable::List
  #any?
    on a really big list
      doesn't run out of stack
    when empty
      with a block returns false
      with no block returns false
    when not empty
      with a block
        returns true if the block ever returns true ("A")
        returns true if the block ever returns true ("B")
        returns true if the block ever returns true ("C")
        returns true if the block ever returns true (nil)
        returns false if the block always returns false
      with no block
        returns true if any value is truthy
        returns false if all values are falsey

Immutable::List
  #append
    is lazy
    on [] and []
      preserves the left
      preserves the right
      returns []
    on ["A"] and []
      preserves the left
      preserves the right
      returns ["A"]
    on [] and ["A"]
      preserves the left
      preserves the right
      returns ["A"]
    on ["A", "B"] and ["C", "D"]
      preserves the left
      preserves the right
      returns ["A", "B", "C", "D"]
  #concat
    is lazy
    on [] and []
      preserves the left
      preserves the right
      returns []
    on ["A"] and []
      preserves the left
      preserves the right
      returns ["A"]
    on [] and ["A"]
      preserves the left
      preserves the right
      returns ["A"]
    on ["A", "B"] and ["C", "D"]
      preserves the left
      preserves the right
      returns ["A", "B", "C", "D"]
  #+
    is lazy
    on [] and []
      preserves the left
      preserves the right
      returns []
    on ["A"] and []
      preserves the left
      preserves the right
      returns ["A"]
    on [] and ["A"]
      preserves the left
      preserves the right
      returns ["A"]
    on ["A", "B"] and ["C", "D"]
      preserves the left
      preserves the right
      returns ["A", "B", "C", "D"]

Immutable::List
  #at
    on a really big list
      doesn't run out of stack
    [] with 10
      returns nil
    ["A"] with 10
      returns nil
    ["A", "B", "C"] with 0
      returns "A"
    ["A", "B", "C"] with 2
      returns "C"
    ["A", "B", "C"] with -1
      returns "C"
    ["A", "B", "C"] with -2
      returns "B"
    ["A", "B", "C"] with -4
      returns nil

Immutable::List
  #break
    is lazy
    on []
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the prefix
        correctly identifies the remainder
      without a block
        returns a frozen array with two items
        returns self as the prefix
        leaves the remainder empty
    on [1]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the prefix
        correctly identifies the remainder
      without a block
        returns a frozen array with two items
        returns self as the prefix
        leaves the remainder empty
    on [1, 2]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the prefix
        correctly identifies the remainder
      without a block
        returns a frozen array with two items
        returns self as the prefix
        leaves the remainder empty
    on [1, 2, 3]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the prefix
        correctly identifies the remainder
      without a block
        returns a frozen array with two items
        returns self as the prefix
        leaves the remainder empty
    on [1, 2, 3, 4]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the prefix
        correctly identifies the remainder
      without a block
        returns a frozen array with two items
        returns self as the prefix
        leaves the remainder empty
    on [2, 3, 4]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the prefix
        correctly identifies the remainder
      without a block
        returns a frozen array with two items
        returns self as the prefix
        leaves the remainder empty
    on [3, 4]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the prefix
        correctly identifies the remainder
      without a block
        returns a frozen array with two items
        returns self as the prefix
        leaves the remainder empty
    on [4]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the prefix
        correctly identifies the remainder
      without a block
        returns a frozen array with two items
        returns self as the prefix
        leaves the remainder empty

Immutable::List
  #car
    is responded to
    on []
      preserves the original
      returns nil
  #car
    is responded to
    on ["A"]
      preserves the original
      returns "A"
  #car
    is responded to
    on ["A", "B", "C"]
      preserves the original
      returns "A"
  #cadr
    is responded to
    on ["A", "B", "C"]
      preserves the original
      returns "B"
  #caddr
    is responded to
    on ["A", "B", "C"]
      preserves the original
      returns "C"
  #cadddr
    is responded to
    on ["A", "B", "C"]
      preserves the original
      returns nil
  #caddddr
    is responded to
    on ["A", "B", "C"]
      preserves the original
      returns nil
  #cdr
    is responded to
    on []
      preserves the original
      returns Immutable::List[]
  #cdr
    is responded to
    on ["A"]
      preserves the original
      returns Immutable::List[]
  #cdr
    is responded to
    on ["A", "B", "C"]
      preserves the original
      returns Immutable::List["B", "C"]
  #cddr
    is responded to
    on ["A", "B", "C"]
      preserves the original
      returns Immutable::List["C"]
  #cdddr
    is responded to
    on ["A", "B", "C"]
      preserves the original
      returns Immutable::List[]
  #cddddr
    is responded to
    on ["A", "B", "C"]
      preserves the original
      returns Immutable::List[]

Immutable::List
  #chunk
    is lazy
    on []
      preserves the original
      returns []
    on ["A"]
      preserves the original
      returns [Immutable::List["A"]]
    on ["A", "B", "C"]
      preserves the original
      returns [Immutable::List["A", "B"], Immutable::List["C"]]

Immutable::List
  #clear
    on []
      preserves the original
      returns an empty list
    on ["A"]
      preserves the original
      returns an empty list
    on ["A", "B", "C"]
      preserves the original
      returns an empty list

Immutable::List
  #combination
    is lazy
    on ["A", "B", "C", "D"] in groups of 1
      preserves the original
      returns [Immutable::List["A"], Immutable::List["B"], Immutable::List["C"], Immutable::List["D"]]
    on ["A", "B", "C", "D"] in groups of 2
      preserves the original
      returns [Immutable::List["A", "B"], Immutable::List["A", "C"], Immutable::List["A", "D"], Immutable::List["B", "C"], Immutable::List["B", "D"], Immutable::List["C", "D"]]
    on ["A", "B", "C", "D"] in groups of 3
      preserves the original
      returns [Immutable::List["A", "B", "C"], Immutable::List["A", "B", "D"], Immutable::List["A", "C", "D"], Immutable::List["B", "C", "D"]]
    on ["A", "B", "C", "D"] in groups of 4
      preserves the original
      returns [Immutable::List["A", "B", "C", "D"]]
    on ["A", "B", "C", "D"] in groups of 0
      preserves the original
      returns [Immutable::List[]]
    on ["A", "B", "C", "D"] in groups of 5
      preserves the original
      returns []
    on [] in groups of 0
      preserves the original
      returns [Immutable::List[]]
    on [] in groups of 1
      preserves the original
      returns []

Immutable::List
  #compact
    is lazy
    on []
      preserves the original
      returns []
    on ["A"]
      preserves the original
      returns ["A"]
    on ["A", "B", "C"]
      preserves the original
      returns ["A", "B", "C"]
    on [nil]
      preserves the original
      returns []
    on [nil, "B"]
      preserves the original
      returns ["B"]
    on ["A", nil]
      preserves the original
      returns ["A"]
    on [nil, nil]
      preserves the original
      returns []
    on ["A", nil, "C"]
      preserves the original
      returns ["A", "C"]
    on [nil, "B", nil]
      preserves the original
      returns ["B"]

Immutable::List
  #<=>
    with [] and [1]
      returns -1
    with [1] and []
      returns 1
    with [] and []
      returns 0
    with [1] and [2]
      returns -1
    with [2] and [1]
      returns 1
    with [1] and [1]
      returns 0
    with [1] and [1, 2]
      returns -1
    with [1, 2] and [1]
      returns 1
    with [1] and [1]
      returns 0
    with [2, 3, 4] and [3, 4, 5]
      returns -1
    with [3, 4, 5] and [2, 3, 4]
      returns 1
    with [2, 3, 4] and [2, 3, 4]
      returns 0

Immutable::List
  #cons
    on [] with "A"
      preserves the original
      returns ["A"]
    on ["A"] with "B"
      preserves the original
      returns ["B", "A"]
    on ["A"] with "A"
      preserves the original
      returns ["A", "A"]
    on ["A", "B", "C"] with "D"
      preserves the original
      returns ["D", "A", "B", "C"]

Immutable
  .list
    with no arguments
      always returns the same instance
      returns an empty list
    with a number of items
      always returns a different instance
      is the same as repeatedly using #cons
  .stream
    with no block
      returns an empty list
    with a block
      repeatedly calls the block
  .interval
    for numbers
      is equivalent to a list with explicit values
    for strings
      is equivalent to a list with explicit values
  .repeat
    returns an infinite list with specified value for each element
  .replicate
    returns a list with the specified value repeated the specified number of times
  .iterate
    returns an infinite list where the first item is calculated by applying the block on the initial argument, the second item by applying the function on the previous result and so on
  .enumerate
    returns a list based on the values yielded from the enumerator
    realizes values as they are needed
  []
    takes a variable number of items and returns a list
    returns an empty list when called without arguments

Immutable::List
  on []
    returns self
  on ["A"]
    returns self
  on ["A", "B", "C"]
    returns self
  on []
    returns self
  on ["A"]
    returns self
  on ["A", "B", "C"]
    returns self

Immutable::List
  #count
    on a really big list
      doesn't run out of stack
    on []
      with a block
        returns 0
      without a block
        returns length
    on [1]
      with a block
        returns 1
      without a block
        returns length
    on [1, 2]
      with a block
        returns 1
      without a block
        returns length
    on [1, 2, 3]
      with a block
        returns 2
      without a block
        returns length
    on [1, 2, 3, 4]
      with a block
        returns 2
      without a block
        returns length
    on [1, 2, 3, 4, 5]
      with a block
        returns 3
      without a block
        returns length

Immutable
  #cycle
    is lazy
    with an empty list
      returns an empty list
    with a non-empty list
      preserves the original
      infinitely cycles through all values

Immutable::List
  #delete_at
    removes the element at the specified index
    makes no modification if the index is out of range

Immutable::List
  #delete
    removes elements that are #== to the argument

Immutable::List
  #drop
    is lazy
    with 10 from []
      preserves the original
      returns []
    with 10 from ["A"]
      preserves the original
      returns []
    with -1 from ["A"]
      preserves the original
      returns ["A"]
    with 0 from ["A", "B", "C"]
      preserves the original
      returns ["A", "B", "C"]
    with 2 from ["A", "B", "C"]
      preserves the original
      returns ["C"]

Immutable::List
  #drop_while
    is lazy
    on []
      with a block
        preserves the original
        returns []
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        preserves the original
        returns []
      without a block
        returns an Enumerator
    on ["A", "B", "C"]
      with a block
        preserves the original
        returns ["C"]
      without a block
        returns an Enumerator

Immutable::List
  #each_chunk
    on a really big list
      doesn't run out of stack
    on []
      with a block
        preserves the original
        iterates over the items in order
        returns self
      without a block
        preserves the original
        returns an Enumerator
    on ["A"]
      with a block
        preserves the original
        iterates over the items in order
        returns self
      without a block
        preserves the original
        returns an Enumerator
    on ["A", "B", "C"]
      with a block
        preserves the original
        iterates over the items in order
        returns self
      without a block
        preserves the original
        returns an Enumerator
  #each_slice
    on a really big list
      doesn't run out of stack
    on []
      with a block
        preserves the original
        iterates over the items in order
        returns self
      without a block
        preserves the original
        returns an Enumerator
    on ["A"]
      with a block
        preserves the original
        iterates over the items in order
        returns self
      without a block
        preserves the original
        returns an Enumerator
    on ["A", "B", "C"]
      with a block
        preserves the original
        iterates over the items in order
        returns self
      without a block
        preserves the original
        returns an Enumerator

Immutable::List
  #each
    on a really big list
      doesn't run out of stack
    on []
      with a block
        iterates over the items in order
        returns nil
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        iterates over the items in order
        returns nil
      without a block
        returns an Enumerator
    on ["A", "B", "C"]
      with a block
        iterates over the items in order
        returns nil
      without a block
        returns an Enumerator

Immutable::List
  #each_with_index
    with no block
      returns an Enumerator
    with a block
      returns self
      iterates over the items in order, yielding item and index

Immutable::List
  #empty?
    on a really big list
      doesn't run out of stack
    on []
      returns true
    on ["A"]
      returns false
    on ["A", "B", "C"]
      returns false

Immutable::List
  Immutable::List["A", "B", "C"] should == ["A", "B", "C"]
  Immutable::List["A", "B", "C"] should not eql? ["A", "B", "C"]
  Immutable::List["A", "B", "C"] should not == #<Object:0xf50e5d1c>
  Immutable::List["A", "B", "C"] should not eql? #<Object:0xf50e540c>
  Immutable::List[] should == []
  Immutable::List[] should not eql? []
  Immutable::List[] should eql? Immutable::List[]
  Immutable::List[] should == Immutable::List[]
  Immutable::List[] should not eql? Immutable::List[nil]
  Immutable::List["A"] should not eql? Immutable::List[]
  Immutable::List["A"] should eql? Immutable::List["A"]
  Immutable::List["A"] should == Immutable::List["A"]
  Immutable::List["A"] should not eql? Immutable::List["B"]
  Immutable::List["A", "B"] should not eql? Immutable::List["A"]
  Immutable::List["A", "B", "C"] should eql? Immutable::List["A", "B", "C"]
  Immutable::List["A", "B", "C"] should == Immutable::List["A", "B", "C"]
  Immutable::List["C", "A", "B"] should not eql? Immutable::List["A", "B", "C"]
  Immutable::List["A"] should == ["A"]
  ["A"] should == Immutable::List["A"]
  Immutable::List["A"] should not eql? ["A"]
  ["A"] should not eql? Immutable::List["A"]
  #eql?
    on a really big list
      doesn't run out of stack

Immutable::List
  #fill
    can replace a range of items at the beginning of a list
    can replace a range of items in the middle of a list
    can replace a range of items at the end of a list
    can replace all the items in a list
    can fill past the end of the list
    is lazy
    with 1 argument
      replaces all the items in the list by default
    with 2 arguments
      replaces up to the end of the list by default
    when index and length are 0
      leaves the list unmodified

Immutable::List
  #find_all
    is lazy
    with an empty array
      with a block
        preserves the original
        returns the found list
      without a block
        returns an Enumerator
    with a single item array
      with a block
        preserves the original
        returns the found list
      without a block
        returns an Enumerator
    with a multi-item array
      with a block
        preserves the original
        returns the found list
      without a block
        returns an Enumerator
    with a multi-item single find_allable array
      with a block
        preserves the original
        returns the found list
      without a block
        returns an Enumerator
    with a multi-item multi-find_allable array
      with a block
        preserves the original
        returns the found list
      without a block
        returns an Enumerator

Immutable::List
  #find_index
    on a really big list
      doesn't run out of stack
    looking for "A" in []
      returns nil
    looking for nil in []
      returns nil
    looking for "A" in ["A"]
      returns 0
    looking for "B" in ["A"]
      returns nil
    looking for nil in ["A"]
      returns nil
    looking for "A" in ["A", "B", nil]
      returns 0
    looking for "B" in ["A", "B", nil]
      returns 1
    looking for nil in ["A", "B", nil]
      returns 2
    looking for "C" in ["A", "B", nil]
      returns nil
    looking for 2 in [2]
      returns 0
    looking for 2.0 in [2]
      returns 0
    looking for 2.0 in [2.0]
      returns 0
    looking for 2 in [2.0]
      returns 0
  #index
    on a really big list
      doesn't run out of stack
    looking for "A" in []
      returns nil
    looking for nil in []
      returns nil
    looking for "A" in ["A"]
      returns 0
    looking for "B" in ["A"]
      returns nil
    looking for nil in ["A"]
      returns nil
    looking for "A" in ["A", "B", nil]
      returns 0
    looking for "B" in ["A", "B", nil]
      returns 1
    looking for nil in ["A", "B", nil]
      returns 2
    looking for "C" in ["A", "B", nil]
      returns nil
    looking for 2 in [2]
      returns 0
    looking for 2.0 in [2]
      returns 0
    looking for 2.0 in [2.0]
      returns 0
    looking for 2 in [2.0]
      returns 0

Immutable::List
  #find
    on a really big list
      doesn't run out of stack
    on []
      with a block
        returns nil
      without a block
        returns an Enumerator
    on []
      with a block
        returns nil
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns "A"
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns nil
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns nil
      without a block
        returns an Enumerator
    on ["A", "B", nil]
      with a block
        returns "A"
      without a block
        returns an Enumerator
    on ["A", "B", nil]
      with a block
        returns "B"
      without a block
        returns an Enumerator
    on ["A", "B", nil]
      with a block
        returns nil
      without a block
        returns an Enumerator
    on ["A", "B", nil]
      with a block
        returns nil
      without a block
        returns an Enumerator
  #detect
    on a really big list
      doesn't run out of stack
    on []
      with a block
        returns nil
      without a block
        returns an Enumerator
    on []
      with a block
        returns nil
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns "A"
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns nil
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns nil
      without a block
        returns an Enumerator
    on ["A", "B", nil]
      with a block
        returns "A"
      without a block
        returns an Enumerator
    on ["A", "B", nil]
      with a block
        returns "B"
      without a block
        returns an Enumerator
    on ["A", "B", nil]
      with a block
        returns nil
      without a block
        returns an Enumerator
    on ["A", "B", nil]
      with a block
        returns nil
      without a block
        returns an Enumerator

Immutable::List
  #flat_map
    with an empty list
      returns the flattened values as a Immutable::List
      returns a Immutable::List
    with a block that returns an empty list
      returns the flattened values as a Immutable::List
      returns a Immutable::List
    with a list of one item
      returns the flattened values as a Immutable::List
      returns a Immutable::List
    with a list of multiple items
      returns the flattened values as a Immutable::List
      returns a Immutable::List

Immutable
  #flatten
    is lazy
    on []
      preserves the original
      returns an empty list
    on ["A"]
      preserves the original
      returns an empty list
    on ["A", "B", "C"]
      preserves the original
      returns an empty list
    on ["A", Immutable::List["B"], "C"]
      preserves the original
      returns an empty list
    on [Immutable::List["A"], Immutable::List["B"], Immutable::List["C"]]
      preserves the original
      returns an empty list

Immutable::List
  #grep
    is lazy
    without a block
      on []
        returns []
      on ["A"]
        returns ["A"]
      on [1]
        returns []
      on ["A", 2, "C"]
        returns ["A", "C"]
    with a block
      on []
        preserves the original
        returns []
      on ["A"]
        preserves the original
        returns ["a"]
      on [1]
        preserves the original
        returns []
      on ["A", 2, "C"]
        preserves the original
        returns ["a", "c"]

Immutable::List
  #group_by
    on a really big list
      doesn't run out of stack
    with a block
      on []
        returns []
      on [1]
        returns [{true=>Immutable::List[1]}]
      on [1, 2, 3, 4]
        returns [{true=>Immutable::List[3, 1], false=>Immutable::List[4, 2]}]
    without a block
      on []
        returns []
      on [1]
        returns [{1=>Immutable::List[1]}]
      on [1, 2, 3, 4]
        returns [{1=>Immutable::List[1], 2=>Immutable::List[2], 3=>Immutable::List[3], 4=>Immutable::List[4]}]
  #group
    on a really big list
      doesn't run out of stack
    with a block
      on []
        returns []
      on [1]
        returns [{true=>Immutable::List[1]}]
      on [1, 2, 3, 4]
        returns [{true=>Immutable::List[3, 1], false=>Immutable::List[4, 2]}]
    without a block
      on []
        returns []
      on [1]
        returns [{1=>Immutable::List[1]}]
      on [1, 2, 3, 4]
        returns [{1=>Immutable::List[1], 2=>Immutable::List[2], 3=>Immutable::List[3], 4=>Immutable::List[4]}]

Immutable::List
  #hash
    values are sufficiently distributed
    on a really big list
      doesn't run out of stack
    on an empty list
      returns 0

Immutable::List
  #head
    on []
      returns nil
    on ["A"]
      returns "A"
    on ["A", "B", "C"]
      returns "A"
  #first
    on []
      returns nil
    on ["A"]
      returns "A"
    on ["A", "B", "C"]
      returns "A"

Immutable::List
  #include?
    on a really big list
      doesn't run out of stack
    on []
      returns false
    on []
      returns false
    on ["A"]
      returns true
    on ["A"]
      returns false
    on ["A"]
      returns false
    on ["A", "B", nil]
      returns true
    on ["A", "B", nil]
      returns true
    on ["A", "B", nil]
      returns true
    on ["A", "B", nil]
      returns false
    on [2]
      returns true
    on [2]
      returns true
    on [2.0]
      returns true
    on [2.0]
      returns true
  #member?
    on a really big list
      doesn't run out of stack
    on []
      returns false
    on []
      returns false
    on ["A"]
      returns true
    on ["A"]
      returns false
    on ["A"]
      returns false
    on ["A", "B", nil]
      returns true
    on ["A", "B", nil]
      returns true
    on ["A", "B", nil]
      returns true
    on ["A", "B", nil]
      returns false
    on [2]
      returns true
    on [2]
      returns true
    on [2.0]
      returns true
    on [2.0]
      returns true

Immutable::List
  #index
    on a really big list
      doesn't run out of stack
    looking for "A" in []
      returns nil
    looking for nil in []
      returns nil
    looking for "A" in ["A"]
      returns 0
    looking for "B" in ["A"]
      returns nil
    looking for nil in ["A"]
      returns nil
    looking for "A" in ["A", "B", nil]
      returns 0
    looking for "B" in ["A", "B", nil]
      returns 1
    looking for nil in ["A", "B", nil]
      returns 2
    looking for "C" in ["A", "B", nil]
      returns nil
    looking for 2 in [2]
      returns 0
    looking for 2.0 in [2]
      returns 0
    looking for 2.0 in [2.0]
      returns 0
    looking for 2 in [2.0]
      returns 0

Immutable::List
  #indices
    when called with a block
      is lazy
      on a large list which doesn't contain desired item
        doesn't blow the stack
      looking for "A" in []
        returns []
      looking for "B" in ["A"]
        returns []
      looking for "B" in ["A", "B", "A"]
        returns [1]
      looking for "A" in ["A", "B", "A"]
        returns [0, 2]
      looking for 2 in [2]
        returns [0]
      looking for 2.0 in [2]
        returns [0]
      looking for 2.0 in [2.0]
        returns [0]
      looking for 2 in [2.0]
        returns [0]
    when called with a single argument
      is lazy
      looking for "A" in []
        returns []
      looking for "B" in ["A"]
        returns []
      looking for "B" in ["A", "B", "A"]
        returns [1]
      looking for "A" in ["A", "B", "A"]
        returns [0, 2]
      looking for 2 in [2]
        returns [0]
      looking for 2.0 in [2]
        returns [0]
      looking for 2.0 in [2.0]
        returns [0]
      looking for 2 in [2.0]
        returns [0]

Immutable::List
  #init
    is lazy
    on []
      preserves the original
      returns the list without the last element: []
    on ["A"]
      preserves the original
      returns the list without the last element: []
    on ["A", "B", "C"]
      preserves the original
      returns the list without the last element: ["A", "B"]

Immutable::List
  #inits
    is lazy
    on []
      preserves the original
      returns []
    on ["A"]
      preserves the original
      returns [Immutable::List["A"]]
    on ["A", "B", "C"]
      preserves the original
      returns [Immutable::List["A"], Immutable::List["A", "B"], Immutable::List["A", "B", "C"]]

Immutable::List
  #insert
    can add items at the beginning of a list
    can add items in the middle of a list
    can add items at the end of a list
    can add items past the end of a list
    accepts a negative index, which counts back from the end of the list
    raises IndexError if a negative index is too great
    is lazy

Immutable::List
  #inspect
    on a really big list
      doesn't run out of stack
    on []
      returns "Immutable::List[]"
      returns a string which can be eval'd to get an equivalent object
    on ["A"]
      returns "Immutable::List[\"A\"]"
      returns a string which can be eval'd to get an equivalent object
    on ["A", "B", "C"]
      returns "Immutable::List[\"A\", \"B\", \"C\"]"
      returns a string which can be eval'd to get an equivalent object

Immutable::List
  #intersperse
    is lazy
    on []
      preserves the original
      returns []
    on ["A"]
      preserves the original
      returns ["A"]
    on ["A", "B", "C"]
      preserves the original
      returns ["A", "|", "B", "|", "C"]

Immutable::List
  #join
    on a really big list
      doesn't run out of stack
    with a separator
      on []
        preserves the original
        returns ""
      on ["A"]
        preserves the original
        returns "A"
      on ["A", "B", "C"]
        preserves the original
        returns "A|B|C"
    without a separator
      on []
        preserves the original
        returns ""
      on ["A"]
        preserves the original
        returns "A"
      on ["A", "B", "C"]
        preserves the original
        returns "ABC"
    without a separator (with global default separator set)
      uses the default global separator

Immutable::List
  #last
    on a really big list
      doesn't run out of stack
    on []
      returns nil
    on ["A"]
      returns "A"
    on ["A", "B", "C"]
      returns "C"

Immutable::List
  #<<
    adds an item onto the end of a list
    on an empty list
      returns a list with one item

Immutable::List
  #map
    is lazy
    on []
      with a block
        preserves the original
        returns []
        is lazy
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        preserves the original
        returns ["a"]
        is lazy
      without a block
        returns an Enumerator
    on ["A", "B", "C"]
      with a block
        preserves the original
        returns ["a", "b", "c"]
        is lazy
      without a block
        returns an Enumerator
  #collect
    is lazy
    on []
      with a block
        preserves the original
        returns []
        is lazy
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        preserves the original
        returns ["a"]
        is lazy
      without a block
        returns an Enumerator
    on ["A", "B", "C"]
      with a block
        preserves the original
        returns ["a", "b", "c"]
        is lazy
      without a block
        returns an Enumerator

Immutable::List
  #max
    on a really big list
      doesn't run out of stack
    with a block
      on []
        returns nil
      on ["A"]
        returns "A"
      on ["Ichi", "Ni", "San"]
        returns "Ichi"
    without a block
      on []
        returns nil
      on ["A"]
        returns "A"
      on ["Ichi", "Ni", "San"]
        returns "San"

Immutable::List
  without a comparator
    on an empty list
      returns an empty list
    on a single list
      returns the list
    with multiple lists
      merges the lists based on natural sort order
  with a comparator
    on an empty list
      returns an empty list
    on a single list
      returns the list
    with multiple lists
      merges the lists based on the specified transformer

Immutable::List
  without a comparator
    on an empty list
      returns an empty list
    on a single list
      returns the list
    with multiple lists
      merges the lists based on natural sort order
  with a comparator
    on an empty list
      returns an empty list
    on a single list
      returns the list
    with multiple lists
      merges the lists based on the specified comparator

Immutable::List
  #min
    on a really big list
      doesn't run out of stack
    with a block
      on []
        returns nil
      on ["A"]
        returns "A"
      on ["Ichi", "Ni", "San"]
        returns "Ni"
    without a block
      on []
        returns nil
      on ["A"]
        returns "A"
      on ["Ichi", "Ni", "San"]
        returns "Ichi"

Immutable::List
  ensures each node of a lazy list will only be realized on ONE thread, even when accessed by multiple threads
  doesn't go into an infinite loop if lazy list block raises an exception
  doesn't give horrendously bad performance if thread realizing the list sleeps

Immutable::List
  #none?
    on a really big list
      doesn't run out of stack
    when empty
      with a block returns true
      with no block returns true
    when not empty
      with a block
        returns false if the block ever returns true ("A")
        returns false if the block ever returns true ("B")
        returns false if the block ever returns true ("C")
        returns false if the block ever returns true (nil)
        returns true if the block always returns false
      with no block
        returns false if any value is truthy
        returns true if all values are falsey

Immutable::List
  #one?
    on a really big list
      doesn't run out of stack
    when empty
      with a block returns false
      with no block returns false
    when not empty
      with a block
        returns false if the block returns true more than once
        returns false if the block never returns true
        returns true if the block only returns true once
      with no block
        returns false if more than one value is truthy
        returns true if only one value is truthy

Immutable::List
  #partition
    is lazy
    calls the passed block only once for each item
    returns a lazy list of items for which predicate is true
    returns a lazy list of items for which predicate is false
    calls the passed block only once for each item, even with multiple threads
    on []
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [1]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [1, 2]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [1, 2, 3]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [1, 2, 3, 4]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [2, 3, 4]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [3, 4]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [4]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator

Immutable::List
  #permutation
    with no block
      returns an Enumerator
    with no argument
      yields all permutations of the list
    with a length argument
      yields all N-size permutations of the list
    with a length argument greater than length of list
      yields nothing
    with a length argument of 0
      yields an empty list
    with a block
      returns the original list

Immutable::List
  #pop
    with an empty list
      returns an empty list
    with a list with a few items
      removes the last item

Immutable::List
  #product
    on a really big list
      doesn't run out of stack
    on []
      returns 1
    on [2]
      returns 2
    on [1, 3, 5, 7, 11]
      returns 1155

Immutable::List
  #reduce
    on a really big list
      doesn't run out of stack
    on []
      with an initial value of 10 and a block
        returns 10
    on [1]
      with an initial value of 10 and a block
        returns 9
    on [1, 2, 3]
      with an initial value of 10 and a block
        returns 4
    on []
      with no initial value and a block
        returns nil
    on [1]
      with no initial value and a block
        returns 1
    on [1, 2, 3]
      with no initial value and a block
        returns -4
    with no block and a symbol argument
      uses the symbol as the name of a method to reduce with
    with no block and a string argument
      uses the string as the name of a method to reduce with
  #inject
    on a really big list
      doesn't run out of stack
    on []
      with an initial value of 10 and a block
        returns 10
    on [1]
      with an initial value of 10 and a block
        returns 9
    on [1, 2, 3]
      with an initial value of 10 and a block
        returns 4
    on []
      with no initial value and a block
        returns nil
    on [1]
      with no initial value and a block
        returns 1
    on [1, 2, 3]
      with no initial value and a block
        returns -4
    with no block and a symbol argument
      uses the symbol as the name of a method to reduce with
    with no block and a string argument
      uses the string as the name of a method to reduce with

Immutable::List
  #reject
    is lazy
    on []
      with a block
        returns []
        is lazy
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns ["A"]
        is lazy
      without a block
        returns an Enumerator
    on ["A", "B", "C"]
      with a block
        returns ["A", "B", "C"]
        is lazy
      without a block
        returns an Enumerator
    on ["A", "b", "C"]
      with a block
        returns ["A", "C"]
        is lazy
      without a block
        returns an Enumerator
    on ["a", "b", "c"]
      with a block
        returns []
        is lazy
      without a block
        returns an Enumerator
  #delete_if
    is lazy
    on []
      with a block
        returns []
        is lazy
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns ["A"]
        is lazy
      without a block
        returns an Enumerator
    on ["A", "B", "C"]
      with a block
        returns ["A", "B", "C"]
        is lazy
      without a block
        returns an Enumerator
    on ["A", "b", "C"]
      with a block
        returns ["A", "C"]
        is lazy
      without a block
        returns an Enumerator
    on ["a", "b", "c"]
      with a block
        returns []
        is lazy
      without a block
        returns an Enumerator

Immutable::List
  #reverse
    is lazy
    on a really big list
      doesn't run out of stack
    on []
      preserves the original
      returns []
    on ["A"]
      preserves the original
      returns ["A"]
    on ["A", "B", "C"]
      preserves the original
      returns ["C", "B", "A"]

Immutable::List
  #rotate
    when passed no argument
      returns a new list with the first element moved to the end
    with an integral argument n
      returns a new list with the first (n % size) elements moved to the end
    with a non-numeric argument
      raises a TypeError
    with an argument of zero (or one evenly divisible by list length)
      it returns self

Immutable::List
  #sample
    returns a randomly chosen item

Immutable::List
  #select
    is lazy
    with an empty array
      with a block
        preserves the original
        returns the selected list
      without a block
        returns an Enumerator
    with a single item array
      with a block
        preserves the original
        returns the selected list
      without a block
        returns an Enumerator
    with a multi-item array
      with a block
        preserves the original
        returns the selected list
      without a block
        returns an Enumerator
    with a multi-item single selectable array
      with a block
        preserves the original
        returns the selected list
      without a block
        returns an Enumerator
    with a multi-item multi-selectable array
      with a block
        preserves the original
        returns the selected list
      without a block
        returns an Enumerator

Immutable::List
  #size
    on a really big list
      doesn't run out of stack
    on []
      returns 0
    on ["A"]
      returns 1
    on ["A", "B", "C"]
      returns 3
  #length
    on a really big list
      doesn't run out of stack
    on []
      returns 0
    on ["A"]
      returns 1
    on ["A", "B", "C"]
      returns 3

Immutable::List
  #slice
    when passed a positive integral index
      returns the element at that index
      leaves the original unchanged
    when passed a negative integral index
      returns the element which is number (index.abs) counting from the end of the list
    when passed a positive integral index and count
      returns 'count' elements starting from 'index'
      leaves the original unchanged
    when passed a negative integral index and count
      returns 'count' elements, starting from index which is number 'index.abs' counting from the end of the array
    when passed a Range
      returns the elements whose indexes are within the given Range
      leaves the original unchanged
  when passed a subclass of Range
    works the same as with a Range
  #[]
    when passed a positive integral index
      returns the element at that index
      leaves the original unchanged
    when passed a negative integral index
      returns the element which is number (index.abs) counting from the end of the list
    when passed a positive integral index and count
      returns 'count' elements starting from 'index'
      leaves the original unchanged
    when passed a negative integral index and count
      returns 'count' elements, starting from index which is number 'index.abs' counting from the end of the array
    when passed a Range
      returns the elements whose indexes are within the given Range
      leaves the original unchanged
  when passed a subclass of Range
    works the same as with a Range

Immutable::List
  #sort
    is lazy
    on []
      with a block
        preserves the original
        returns []
      without a block
        preserves the original
        returns []
    on ["A"]
      with a block
        preserves the original
        returns ["A"]
      without a block
        preserves the original
        returns ["A"]
    on ["Ichi", "Ni", "San"]
      with a block
        preserves the original
        returns ["Ni", "San", "Ichi"]
      without a block
        preserves the original
        returns ["Ichi", "Ni", "San"]
  #sort_by
    is lazy
    on []
      with a block
        preserves the original
        returns []
      without a block
        preserves the original
        returns []
    on ["A"]
      with a block
        preserves the original
        returns ["A"]
      without a block
        preserves the original
        returns ["A"]
    on ["Ichi", "Ni", "San"]
      with a block
        preserves the original
        returns ["Ni", "San", "Ichi"]
      without a block
        preserves the original
        returns ["Ichi", "Ni", "San"]

List#span
  is lazy
  given a predicate (in the form of a block), splits the list into two lists
  (returned as an array) such that elements in the first list (the prefix) are
  taken from the head of the list while the predicate is satisfied, and elements
  in the second list (the remainder) are the remaining elements from the list
  once the predicate is not satisfied. For example:
    given the list []
      and a predicate that returns true for values <= 2
        preserves the original
        returns the prefix as []
        returns the remainder as []
        calls the block only once for each element
      without a predicate
        returns a frozen array
        returns self as the prefix
        returns an empty list as the remainder
    given the list [1]
      and a predicate that returns true for values <= 2
        preserves the original
        returns the prefix as [1]
        returns the remainder as []
        calls the block only once for each element
      without a predicate
        returns a frozen array
        returns self as the prefix
        returns an empty list as the remainder
    given the list [1, 2]
      and a predicate that returns true for values <= 2
        preserves the original
        returns the prefix as [1, 2]
        returns the remainder as []
        calls the block only once for each element
      without a predicate
        returns a frozen array
        returns self as the prefix
        returns an empty list as the remainder
    given the list [1, 2, 3]
      and a predicate that returns true for values <= 2
        preserves the original
        returns the prefix as [1, 2]
        returns the remainder as [3]
        calls the block only once for each element
      without a predicate
        returns a frozen array
        returns self as the prefix
        returns an empty list as the remainder
    given the list [1, 2, 3, 4]
      and a predicate that returns true for values <= 2
        preserves the original
        returns the prefix as [1, 2]
        returns the remainder as [3, 4]
        calls the block only once for each element
      without a predicate
        returns a frozen array
        returns self as the prefix
        returns an empty list as the remainder
    given the list [2, 3, 4]
      and a predicate that returns true for values <= 2
        preserves the original
        returns the prefix as [2]
        returns the remainder as [3, 4]
        calls the block only once for each element
      without a predicate
        returns a frozen array
        returns self as the prefix
        returns an empty list as the remainder
    given the list [3, 4]
      and a predicate that returns true for values <= 2
        preserves the original
        returns the prefix as []
        returns the remainder as [3, 4]
        calls the block only once for each element
      without a predicate
        returns a frozen array
        returns self as the prefix
        returns an empty list as the remainder
    given the list [4]
      and a predicate that returns true for values <= 2
        preserves the original
        returns the prefix as []
        returns the remainder as [4]
        calls the block only once for each element
      without a predicate
        returns a frozen array
        returns self as the prefix
        returns an empty list as the remainder

Immutable::List
  #split_at
    is lazy
    on []
      preserves the original
      returns a frozen array with two items
      correctly identifies the matches
      correctly identifies the remainder
    on [1]
      preserves the original
      returns a frozen array with two items
      correctly identifies the matches
      correctly identifies the remainder
    on [1, 2]
      preserves the original
      returns a frozen array with two items
      correctly identifies the matches
      correctly identifies the remainder
    on [1, 2, 3]
      preserves the original
      returns a frozen array with two items
      correctly identifies the matches
      correctly identifies the remainder
    on [1, 2, 3, 4]
      preserves the original
      returns a frozen array with two items
      correctly identifies the matches
      correctly identifies the remainder

Immutable::List
  #subsequences
    yields all sublists with 1 or more consecutive items
    with no block
      returns an Enumerator

Immutable::List
  #sum
    on a really big list
      doesn't run out of stack
    on []
      returns 0
    on [2]
      returns 2
    on [1, 3, 5, 7, 11]
      returns 27

Immutable::List
  #tail
    on a really big list
      doesn't run out of stack
    on []
      preserves the original
      returns []
    on ["A"]
      preserves the original
      returns []
    on ["A", "B", "C"]
      preserves the original
      returns ["B", "C"]

Immutable::List
  #tails
    is lazy
    on []
      preserves the original
      returns []
    on ["A"]
      preserves the original
      returns [Immutable::List["A"]]
    on ["A", "B", "C"]
      preserves the original
      returns [Immutable::List["A", "B", "C"], Immutable::List["B", "C"], Immutable::List["C"]]

Immutable::List
  #take
    is lazy
    10 from []
      preserves the original
      returns []
    10 from ["A"]
      preserves the original
      returns ["A"]
    -1 from ["A"]
      preserves the original
      returns []
    0 from ["A", "B", "C"]
      preserves the original
      returns []
    2 from ["A", "B", "C"]
      preserves the original
      returns ["A", "B"]

Immutable::List
  #take_while
    is lazy
    on []
      with a block
        returns []
        preserves the original
        is lazy
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns ["A"]
        preserves the original
        is lazy
      without a block
        returns an Enumerator
    on ["A", "B", "C"]
      with a block
        returns ["A", "B"]
        preserves the original
        is lazy
      without a block
        returns an Enumerator

Immutable::List
  #to_a
    on a really big list
      doesn't run out of stack
    on []
      returns []
      leaves the original unchanged
      returns a mutable array
    on ["A"]
      returns ["A"]
      leaves the original unchanged
      returns a mutable array
    on ["A", "B", "C"]
      returns ["A", "B", "C"]
      leaves the original unchanged
      returns a mutable array
  #entries
    on a really big list
      doesn't run out of stack
    on []
      returns []
      leaves the original unchanged
      returns a mutable array
    on ["A"]
      returns ["A"]
      leaves the original unchanged
      returns a mutable array
    on ["A", "B", "C"]
      returns ["A", "B", "C"]
      leaves the original unchanged
      returns a mutable array

Immutable::List
  #to_ary
    on a really big list
      doesn't run out of stack
    enables implicit conversion to
      block parameters
      method arguments
      works with splat

Immutable::List
  #to_list
    on []
      returns self
    on ["A"]
      returns self
    on ["A", "B", "C"]
      returns self

Immutable::List
  #to_set
    on []
      returns a set with the same values
    on ["A"]
      returns a set with the same values
    on ["A", "B", "C"]
      returns a set with the same values

Immutable::List
  #transpose
    takes a list of lists and returns a list of all the first elements, all the 2nd elements, and so on
    only goes as far as the shortest list

Immutable::List
  #union
    is lazy
    returns []
      for [] and []
      for [] and []
    returns ["A"]
      for ["A"] and []
      for [] and ["A"]
    returns ["A", "B", "C"]
      for ["A", "B", "C"] and []
      for [] and ["A", "B", "C"]
    returns ["A"]
      for ["A", "A"] and ["A"]
      for ["A"] and ["A", "A"]
  #|
    is lazy
    returns []
      for [] and []
      for [] and []
    returns ["A"]
      for ["A"] and []
      for [] and ["A"]
    returns ["A", "B", "C"]
      for ["A", "B", "C"] and []
      for [] and ["A", "B", "C"]
    returns ["A"]
      for ["A", "A"] and ["A"]
      for ["A"] and ["A", "A"]

Immutable::List
  #uniq
    is lazy
    when passed a block
      uses the block to identify duplicates
    on []
      preserves the original
      returns []
    on ["A"]
      preserves the original
      returns ["A"]
    on ["A", "B", "C"]
      preserves the original
      returns ["A", "B", "C"]
    on ["A", "B", "A", "C", "C"]
      preserves the original
      returns ["A", "B", "C"]

Immutable::List
  #zip
    is lazy
    on [] and []
      returns []
    on ["A"] and ["aye"]
      returns [Immutable::List["A", "aye"]]
    on ["A"] and []
      returns [Immutable::List["A", nil]]
    on [] and ["A"]
      returns [Immutable::List[nil, "A"]]
    on ["A", "B", "C"] and ["aye", "bee", "see"]
      returns [Immutable::List["A", "aye"], Immutable::List["B", "bee"], Immutable::List["C", "see"]]

Immutable
  .from
    with {"a"=>1, "b"=>[2, {"c"=>3}, 4], "d"=>#<Set: {5, 6, 7}>, "e"=>{"f"=>8, "g"=>9}, "h"=>/ijk/} as input
      should return Immutable::Hash["h" => /ijk/, "b" => Immutable::Vector[2, Immutable::Hash["c" => 3], 4], "a" => 1, "d" => Immutable::Set[6, 7, 5], "e" => Immutable::Hash["g" => 9, "f" => 8]]
    with {} as input
      should return Immutable::Hash[]
    with {"a"=>1, "b"=>2, "c"=>3} as input
      should return Immutable::Hash["b" => 2, "a" => 1, "c" => 3]
    with [] as input
      should return Immutable::Vector[]
    with [1, 2, 3] as input
      should return Immutable::Vector[1, 2, 3]
    with #<Set: {}> as input
      should return Immutable::Set[]
    with #<Set: {1, 2, 3}> as input
      should return Immutable::Set[2, 1, 3]
    with 42 as input
      should return 42
    with #<IO:<STDOUT>> as input
      should return #<IO:<STDOUT>>
    with #<struct Struct::Customer name=nil, address=nil> as input
      should return Immutable::Hash[:address => nil, :name => nil]
    with #<struct Struct::Customer name="Dave", address="123 Main"> as input
      should return Immutable::Hash[:address => "123 Main", :name => "Dave"]
    with mixed object
      should return Immutable data
  .to_ruby
    with Immutable::Hash["h" => /ijk/, "b" => Immutable::Vector[2, Immutable::Hash["c" => 3], 4], "a" => 1, "d" => Immutable::Set[6, 7, 5], "e" => Immutable::Hash["g" => 9, "f" => 8]] as input
      should return {"a"=>1, "b"=>[2, {"c"=>3}, 4], "d"=>#<Set: {5, 6, 7}>, "e"=>{"f"=>8, "g"=>9}, "h"=>/ijk/}
    with Immutable::Hash[] as input
      should return {}
    with Immutable::Hash["b" => 2, "a" => 1, "c" => 3] as input
      should return {"a"=>1, "b"=>2, "c"=>3}
    with Immutable::Vector[] as input
      should return []
    with Immutable::Vector[1, 2, 3] as input
      should return [1, 2, 3]
    with Immutable::Set[] as input
      should return #<Set: {}>
    with Immutable::Set[2, 1, 3] as input
      should return #<Set: {1, 2, 3}>
    with 42 as input
      should return 42
    with #<IO:<STDOUT>> as input
      should return #<IO:<STDOUT>>
    with Immutable::Deque[] as input
      should return []
    with Immutable::Deque[Immutable::Hash["a" => 1]] as input
      should return [{"a" => 1}]
    with Immutable::SortedSet[] as input
      should return ::SortedSet.new
    with Immutable::SortedSet[1, 2, 3] as input
      should return ::SortedSet.new
    with mixed object
      should return Ruby data structures

Immutable::Set
  #add
    can add nil to a set
    works on large sets, with many combinations of input
    with a unique value
      preserves the original
      returns a copy with the superset of values
    with a duplicate value
      preserves the original values
      returns self
  #<<
    can add nil to a set
    works on large sets, with many combinations of input
    with a unique value
      preserves the original
      returns a copy with the superset of values
    with a duplicate value
      preserves the original values
      returns self
  #add?
    with a unique value
      preserves the original
      returns a copy with the superset of values
    with a duplicate value
      preserves the original values
      returns false

Immutable::Set
  #all?
    when empty
      with a block returns true
      with no block returns true
    when not empty
      with a block
        returns true if the block always returns true
        returns false if the block ever returns false
        propagates an exception from the block
        stops iterating as soon as the block returns false
      with no block
        returns true if all values are truthy
        returns false if any value is nil
        returns false if any value is false

Immutable::Set
  #any?
    when empty
      with a block returns false
      with no block returns false
    when not empty
      with a block
        returns true if the block ever returns true ("A")
        returns true if the block ever returns true ("B")
        returns true if the block ever returns true ("C")
        returns true if the block ever returns true (nil)
        returns false if the block always returns false
        propagates exceptions raised in the block
        stops iterating as soon as the block returns true
      with no block
        returns true if any value is truthy
        returns false if all values are falsey

Immutable::Set
  #clear
    on []
      preserves the original
      returns an empty set
    on ["A"]
      preserves the original
      returns an empty set
    on ["A", "B", "C"]
      preserves the original
      returns an empty set
    from a subclass
      returns an empty instance of the subclass

Immutable::Set
  #compact
    on []
      preserves the original
      returns []
    on ["A"]
      preserves the original
      returns ["A"]
    on ["A", "B", "C"]
      preserves the original
      returns ["A", "B", "C"]
    on [nil]
      preserves the original
      returns []
    on [nil, "B"]
      preserves the original
      returns ["B"]
    on ["A", nil]
      preserves the original
      returns ["A"]
    on [nil, nil]
      preserves the original
      returns []
    on ["A", nil, "C"]
      preserves the original
      returns ["A", "C"]
    on [nil, "B", nil]
      preserves the original
      returns ["B"]

Immutable::Set
  .set
    with no values
      returns the empty set
    with a list of values
      is equivalent to repeatedly using #add

Immutable::Set
  #dup
    returns self
  #clone
    returns self

Immutable::Set
  #count
    works on large sets
    on []
      with a block
        returns 0
      without a block
        returns length
    on [1]
      with a block
        returns 1
      without a block
        returns length
    on [1, 2]
      with a block
        returns 1
      without a block
        returns length
    on [1, 2, 3]
      with a block
        returns 2
      without a block
        returns length
    on [1, 2, 3, 4]
      with a block
        returns 2
      without a block
        returns length
    on [1, 2, 3, 4, 5]
      with a block
        returns 3
      without a block
        returns length

Immutable::Set
  #delete
    works on large sets, with many combinations of input
    with an existing value
      preserves the original
      returns a copy with the remaining values
    with a non-existing value
      preserves the original values
      returns self
    when removing the last value in a set
      returns the canonical empty set
  #delete?
    with an existing value
      preserves the original
      returns a copy with the remaining values
    with a non-existing value
      preserves the original values
      returns false

Immutable::Set
  #difference
    works on a wide variety of inputs
    for [] and []
      doesn't modify the original Sets
      returns []
    when passed a Ruby Array
      returns the expected Set
    for ["A"] and []
      doesn't modify the original Sets
      returns ["A"]
    when passed a Ruby Array
      returns the expected Set
    for ["A"] and ["A"]
      doesn't modify the original Sets
      returns []
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C"] and ["B"]
      doesn't modify the original Sets
      returns ["A", "C"]
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C"] and ["A", "C"]
      doesn't modify the original Sets
      returns ["B"]
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C", "D", "E", "F", "G", "H"] and []
      doesn't modify the original Sets
      returns ["A", "B", "C", "D", "E", "F", "G", "H"]
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C", "M", "X", "Y", "Z"] and ["B", "C", "D", "E", "F", "G", "H", "I", "J", "X"]
      doesn't modify the original Sets
      returns ["A", "M", "Y", "Z"]
    when passed a Ruby Array
      returns the expected Set
  #subtract
    works on a wide variety of inputs
    for [] and []
      doesn't modify the original Sets
      returns []
    when passed a Ruby Array
      returns the expected Set
    for ["A"] and []
      doesn't modify the original Sets
      returns ["A"]
    when passed a Ruby Array
      returns the expected Set
    for ["A"] and ["A"]
      doesn't modify the original Sets
      returns []
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C"] and ["B"]
      doesn't modify the original Sets
      returns ["A", "C"]
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C"] and ["A", "C"]
      doesn't modify the original Sets
      returns ["B"]
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C", "D", "E", "F", "G", "H"] and []
      doesn't modify the original Sets
      returns ["A", "B", "C", "D", "E", "F", "G", "H"]
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C", "M", "X", "Y", "Z"] and ["B", "C", "D", "E", "F", "G", "H", "I", "J", "X"]
      doesn't modify the original Sets
      returns ["A", "M", "Y", "Z"]
    when passed a Ruby Array
      returns the expected Set
  #-
    works on a wide variety of inputs
    for [] and []
      doesn't modify the original Sets
      returns []
    when passed a Ruby Array
      returns the expected Set
    for ["A"] and []
      doesn't modify the original Sets
      returns ["A"]
    when passed a Ruby Array
      returns the expected Set
    for ["A"] and ["A"]
      doesn't modify the original Sets
      returns []
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C"] and ["B"]
      doesn't modify the original Sets
      returns ["A", "C"]
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C"] and ["A", "C"]
      doesn't modify the original Sets
      returns ["B"]
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C", "D", "E", "F", "G", "H"] and []
      doesn't modify the original Sets
      returns ["A", "B", "C", "D", "E", "F", "G", "H"]
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C", "M", "X", "Y", "Z"] and ["B", "C", "D", "E", "F", "G", "H", "I", "J", "X"]
      doesn't modify the original Sets
      returns ["A", "M", "Y", "Z"]
    when passed a Ruby Array
      returns the expected Set

Immutable::Set
  #disjoint?
    for [] and []
      returns true
    for ["A"] and []
      returns true
    for [] and ["A"]
      returns true
    for ["A"] and ["A"]
      returns false
    for ["A", "B", "C"] and ["B"]
      returns false
    for ["B"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["D", "E"]
      returns true
    for ["F", "G", "H", "I"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "B", "C", "D"]
      returns false
    for ["D", "E", "F", "G"] and ["A", "B", "C"]
      returns true

Immutable::Set
  #each
    yields both of a pair of colliding keys
    without a block
      returns an Enumerator
    with an empty block
      returns self
    with a block
      yields all values

Immutable::Set
  #empty?
    on []
      returns true
    on ["A"]
      returns false
    on ["A", "B", "C"]
      returns false
    on [nil]
      returns false
    on [false]
      returns false
  .empty
    returns the canonical empty set
    from a subclass
      returns an empty instance of the subclass
      calls overridden #initialize when creating empty Set

Immutable::Set
  #==
    when comparing to a standard set
      returns false
    when comparing to a arbitrary object
      returns false
    with an empty set for each comparison
      returns true
    with an empty set and a set with nil
      returns false
    with a single item array and empty array
      returns false
    with matching single item array
      returns true
    with mismatching single item array
      returns false
    with a multi-item array and single item array
      returns false
    with matching multi-item array
      returns true
    with a mismatching multi-item array
      returns true

Immutable::Set
  #eql?
    when comparing to a standard set
      returns false
    when comparing to a arbitrary object
      returns false
    when comparing with a subclass of Immutable::Set
      returns false
    with an empty set for each comparison
      returns true
    with an empty set and a set with nil
      returns false
    with a single item array and empty array
      returns false
    with matching single item array
      returns true
    with mismatching single item array
      returns false
    with a multi-item array and single item array
      returns false
    with matching multi-item array
      returns true
    with a mismatching multi-item array
      returns true

Immutable::Set
  #exclusion
    works for a wide variety of inputs
    for [] and []
      doesn't modify the original Sets
      returns []
    when passed a Ruby Array
      returns the expected Set
    for ["A"] and []
      doesn't modify the original Sets
      returns ["A"]
    when passed a Ruby Array
      returns the expected Set
    for ["A"] and ["A"]
      doesn't modify the original Sets
      returns []
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C"] and ["B"]
      doesn't modify the original Sets
      returns ["A", "C"]
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C"] and ["B", "C", "D"]
      doesn't modify the original Sets
      returns ["A", "D"]
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C"] and ["D", "E", "F"]
      doesn't modify the original Sets
      returns ["A", "B", "C", "D", "E", "F"]
    when passed a Ruby Array
      returns the expected Set
  #^
    works for a wide variety of inputs
    for [] and []
      doesn't modify the original Sets
      returns []
    when passed a Ruby Array
      returns the expected Set
    for ["A"] and []
      doesn't modify the original Sets
      returns ["A"]
    when passed a Ruby Array
      returns the expected Set
    for ["A"] and ["A"]
      doesn't modify the original Sets
      returns []
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C"] and ["B"]
      doesn't modify the original Sets
      returns ["A", "C"]
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C"] and ["B", "C", "D"]
      doesn't modify the original Sets
      returns ["A", "D"]
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C"] and ["D", "E", "F"]
      doesn't modify the original Sets
      returns ["A", "B", "C", "D", "E", "F"]
    when passed a Ruby Array
      returns the expected Set

Immutable::Set
  #find
    on []
      with a block
        returns nil
      without a block
        returns an Enumerator
    on []
      with a block
        returns nil
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns "A"
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns nil
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns nil
      without a block
        returns an Enumerator
    on ["A", "B", nil]
      with a block
        returns "A"
      without a block
        returns an Enumerator
    on ["A", "B", nil]
      with a block
        returns "B"
      without a block
        returns an Enumerator
    on ["A", "B", nil]
      with a block
        returns nil
      without a block
        returns an Enumerator
    on ["A", "B", nil]
      with a block
        returns nil
      without a block
        returns an Enumerator
  #detect
    on []
      with a block
        returns nil
      without a block
        returns an Enumerator
    on []
      with a block
        returns nil
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns "A"
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns nil
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns nil
      without a block
        returns an Enumerator
    on ["A", "B", nil]
      with a block
        returns "A"
      without a block
        returns an Enumerator
    on ["A", "B", nil]
      with a block
        returns "B"
      without a block
        returns an Enumerator
    on ["A", "B", nil]
      with a block
        returns nil
      without a block
        returns an Enumerator
    on ["A", "B", nil]
      with a block
        returns nil
      without a block
        returns an Enumerator

Immutable::Set
  #first
    returns nil if only member of set is nil
    returns the first item yielded by #each
    on an empty set
      returns nil
    on a non-empty set
      returns an arbitrary value from the set

Immutable
  #flatten
    on ["A"]
      preserves the original
      returns the inlined values
    on ["A", "B", "C"]
      preserves the original
      returns the inlined values
    on ["A", Immutable::Set["B"], "C"]
      preserves the original
      returns the inlined values
    on [Immutable::Set["A"], Immutable::Set["B"], Immutable::Set["C"]]
      preserves the original
      returns the inlined values
    on an empty set
      returns an empty set
    on a set with multiple levels of nesting
      inlines lower levels of nesting
    from a subclass
      returns an instance of the subclass

Immutable::Set
  #grep
    without a block
      with an empty set
        returns the filtered values
      with a single item set
        returns the filtered values
      with a single item set that doesn't contain match
        returns the filtered values
      with a multi-item set where one isn't a match
        returns the filtered values
    with a block
      with an empty set
        returns the filtered values
      with a single item set
        returns the filtered values
      with a single item set that doesn't contain match
        returns the filtered values
      with a multi-item set where one isn't a match
        returns the filtered values

Immutable::Set
  #grep_v
    without a block
      with an empty set
        returns the filtered values
      with a single item set
        returns the filtered values
      with a single item set that doesn't contain match
        returns the filtered values
      with a multi-item set where one isn't a match
        returns the filtered values
    with a block
      resulting items are processed with the block
        returns the filtered values

Immutable::Set
  #group_by
    returns a hash without default proc
    with a block
      on []
        returns []
      on [1]
        returns [{true=>Immutable::Set[1]}]
      on [1, 2, 3, 4]
        returns [{true=>Immutable::Set[1, 3], false=>Immutable::Set[2, 4]}]
    without a block
      on []
        returns []
      on [1]
        returns [{1=>Immutable::Set[1]}]
      on [1, 2, 3, 4]
        returns [{1=>Immutable::Set[1], 2=>Immutable::Set[2], 3=>Immutable::Set[3], 4=>Immutable::Set[4]}]
    on an empty set
      returns an empty hash
    from a subclass
      returns an Hash whose values are instances of the subclass
  #group
    returns a hash without default proc
    with a block
      on []
        returns []
      on [1]
        returns [{true=>Immutable::Set[1]}]
      on [1, 2, 3, 4]
        returns [{true=>Immutable::Set[1, 3], false=>Immutable::Set[2, 4]}]
    without a block
      on []
        returns []
      on [1]
        returns [{1=>Immutable::Set[1]}]
      on [1, 2, 3, 4]
        returns [{1=>Immutable::Set[1], 2=>Immutable::Set[2], 3=>Immutable::Set[3], 4=>Immutable::Set[4]}]
    on an empty set
      returns an empty hash
    from a subclass
      returns an Hash whose values are instances of the subclass
  #classify
    returns a hash without default proc
    with a block
      on []
        returns []
      on [1]
        returns [{true=>Immutable::Set[1]}]
      on [1, 2, 3, 4]
        returns [{true=>Immutable::Set[1, 3], false=>Immutable::Set[2, 4]}]
    without a block
      on []
        returns []
      on [1]
        returns [{1=>Immutable::Set[1]}]
      on [1, 2, 3, 4]
        returns [{1=>Immutable::Set[1], 2=>Immutable::Set[2], 3=>Immutable::Set[3], 4=>Immutable::Set[4]}]
    on an empty set
      returns an empty hash
    from a subclass
      returns an Hash whose values are instances of the subclass

Immutable::Set
  #hash
    generates the same hash value for a set regardless of the order things were added to it
    values are sufficiently distributed
    on an empty set
      returns 0

Immutable::Set
  #include?
    returns true for an existing value ("A")
    returns true for an existing value ("B")
    returns true for an existing value ("C")
    returns true for an existing value (2.0)
    returns true for an existing value (nil)
    returns false for a non-existing value
    returns true even if existing value is nil
    returns true even if existing value is false
    returns false for a mutable item which is mutated after adding
    uses #eql? for equality
    returns the right answers after a lot of addings and removings
  #member?
    returns true for an existing value ("A")
    returns true for an existing value ("B")
    returns true for an existing value ("C")
    returns true for an existing value (2.0)
    returns true for an existing value (nil)
    returns false for a non-existing value
    returns true even if existing value is nil
    returns true even if existing value is false
    returns false for a mutable item which is mutated after adding
    uses #eql? for equality
    returns the right answers after a lot of addings and removings

Immutable::Set
  #inspect
    on []
      returns "Immutable::Set[]"
      returns a string which can be eval'd to get an equivalent set
    on ["A"]
      returns "Immutable::Set[\"A\"]"
      returns a string which can be eval'd to get an equivalent set
    on ["A", "B", "C"]
      returns a programmer-readable representation of the set contents
      returns a string which can be eval'd to get an equivalent set
    from a subclass
      returns a programmer-readable representation of the set contents
      returns a string which can be eval'd to get an equivalent set

Immutable::Set
  #intersect?
    for [] and []
      returns false
    for ["A"] and []
      returns false
    for [] and ["A"]
      returns false
    for ["A"] and ["A"]
      returns true
    for ["A", "B", "C"] and ["B"]
      returns true
    for ["B"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["D", "E"]
      returns false
    for ["F", "G", "H", "I"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "B", "C", "D"]
      returns true
    for ["D", "E", "F", "G"] and ["A", "B", "C"]
      returns false

Immutable::Set
  #intersection
    returns results consistent with Array#&
    for [] and []
      returns [], without changing the original Sets
    for [] and []
      returns [], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    for ["A"] and []
      returns [], without changing the original Sets
    for [] and ["A"]
      returns [], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    for ["A"] and ["A"]
      returns ["A"], without changing the original Sets
    for ["A"] and ["A"]
      returns ["A"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C"] and ["B"]
      returns ["B"], without changing the original Sets
    for ["B"] and ["A", "B", "C"]
      returns ["B"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C"] and ["A", "C"]
      returns ["A", "C"], without changing the original Sets
    for ["A", "C"] and ["A", "B", "C"]
      returns ["A", "C"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
  #&
    returns results consistent with Array#&
    for [] and []
      returns [], without changing the original Sets
    for [] and []
      returns [], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    for ["A"] and []
      returns [], without changing the original Sets
    for [] and ["A"]
      returns [], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    for ["A"] and ["A"]
      returns ["A"], without changing the original Sets
    for ["A"] and ["A"]
      returns ["A"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C"] and ["B"]
      returns ["B"], without changing the original Sets
    for ["B"] and ["A", "B", "C"]
      returns ["B"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C"] and ["A", "C"]
      returns ["A", "C"], without changing the original Sets
    for ["A", "C"] and ["A", "B", "C"]
      returns ["A", "C"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set

Immutable::Set
  #join
    with a separator
      on []
        preserves the original
        returns ""
      on ["A"]
        preserves the original
        returns "A"
      on ["A", "B", "C"]
        preserves the original
        returns "A|B|C"
    without a separator
      on []
        preserves the original
        returns ""
      on ["A"]
        preserves the original
        returns "A"
      on ["A", "B", "C"]
        preserves the original
        returns "ABC"
    without a separator (with global default separator set)
      on ['A', 'B', 'C']
        preserves the original
        returns nil

Immutable::Set
  #map
    works on large sets
    when empty
      returns self
    when not empty
      with a block
        preserves the original values
        returns a new set with the mapped values
      with no block
        returns an Enumerator
    from a subclass
      returns an instance of the subclass
    when multiple items map to the same value
      filters out the duplicates
  #collect
    works on large sets
    when empty
      returns self
    when not empty
      with a block
        preserves the original values
        returns a new set with the mapped values
      with no block
        returns an Enumerator
    from a subclass
      returns an instance of the subclass
    when multiple items map to the same value
      filters out the duplicates

Immutable::Set
  #marshal_dump/#marshal_load
    can survive dumping and loading into a new process
    is still possible to test items by key after loading

Immutable::Set
  #max
    with a block
      on []
        returns nil
      on ["A"]
        returns "A"
      on ["Ichi", "Ni", "San"]
        returns "Ichi"
    without a block
      on []
        returns nil
      on ["A"]
        returns "A"
      on ["Ichi", "Ni", "San"]
        returns "San"

Immutable::Set
  #min
    with a block
      on []
        returns nil
      on ["A"]
        returns "A"
      on ["Ichi", "Ni", "San"]
        returns "Ni"
    without a block
      on []
        returns nil
      on ["A"]
        returns "A"
      on ["Ichi", "Ni", "San"]
        returns "Ichi"

Immutable::Set
  .new
    initializes a new set
    accepts a Range
    returns a Set which doesn't change even if the initializer is mutated
    is amenable to overriding of #initialize
    from a subclass
      returns a frozen instance of the subclass
  []
    accepts any number of arguments and initializes a new set

Immutable::Set
  #none?
    when empty
      with a block returns true
      with no block returns true
    when not empty
      with a block
        returns false if the block ever returns true ("A")
        returns false if the block ever returns true ("B")
        returns false if the block ever returns true ("C")
        returns false if the block ever returns true (nil)
        returns true if the block always returns false
        stops iterating as soon as the block returns true
      with no block
        returns false if any value is truthy
        returns true if all values are falsey

Immutable::Set
  #one?
    when empty
      with a block returns false
      with no block returns false
    when not empty
      with a block
        returns false if the block returns true more than once
        returns false if the block never returns true
        returns true if the block only returns true once
      with no block
        returns false if more than one value is truthy
        returns true if only one value is truthy
        returns false if no values are truthy

Immutable::Set
  #partition
    on []
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [1]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [1, 2]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [1, 2, 3]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [1, 2, 3, 4]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [2, 3, 4]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [3, 4]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [4]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator

Immutable::Set
  #product
    on []
      returns 1
      doesn't change the original Set
    on [2]
      returns 2
      doesn't change the original Set
    on [1, 3, 5, 7, 11]
      returns 1155
      doesn't change the original Set

Immutable::Set
  #reduce
    on []
      with an initial value of 10
        and a block
          returns 10
    on [1]
      with an initial value of 10
        and a block
          returns 9
    on [1, 2, 3]
      with an initial value of 10
        and a block
          returns 4
    on []
      with no initial value
        and a block
          returns nil
    on [1]
      with no initial value
        and a block
          returns 1
    on [1, 2, 3]
      with no initial value
        and a block
          returns 6
    with no block and a symbol argument
      uses the symbol as the name of a method to reduce with
    with no block and a string argument
      uses the string as the name of a method to reduce with
  #inject
    on []
      with an initial value of 10
        and a block
          returns 10
    on [1]
      with an initial value of 10
        and a block
          returns 9
    on [1, 2, 3]
      with an initial value of 10
        and a block
          returns 4
    on []
      with no initial value
        and a block
          returns nil
    on [1]
      with no initial value
        and a block
          returns 1
    on [1, 2, 3]
      with no initial value
        and a block
          returns 6
    with no block and a symbol argument
      uses the symbol as the name of a method to reduce with
    with no block and a string argument
      uses the string as the name of a method to reduce with

Immutable::Set
  #reject
    when nothing matches
      returns self
    when only some things match
      with a block
        preserves the original
        returns a set with the matching values
      with no block
        returns self
    on a large set, with many combinations of input
      still works
  #delete_if
    when nothing matches
      returns self
    when only some things match
      with a block
        preserves the original
        returns a set with the matching values
      with no block
        returns self
    on a large set, with many combinations of input
      still works

Immutable::Set
  #reverse_each
    without a block
      returns an Enumerator
    with an empty block
      returns self
    with a block
      yields all values

Immutable::Set
  #sample
    returns a randomly chosen item

Immutable::Set
  #select
    works on a large set, with many combinations of input
    when everything matches
      returns self
    when only some things match
      with a block
        preserves the original
        returns a set with the matching values
      with no block
        returns an Enumerator
    when nothing matches
      preserves the original
      returns the canonical empty set
    from a subclass
      returns an instance of the same class
  #find_all
    works on a large set, with many combinations of input
    when everything matches
      returns self
    when only some things match
      with a block
        preserves the original
        returns a set with the matching values
      with no block
        returns an Enumerator
    when nothing matches
      preserves the original
      returns the canonical empty set
    from a subclass
      returns an instance of the same class

Immutable::Set
  #size
    returns 0 for []
    returns 1 for ["A"]
    returns 3 for ["A", "B", "C"]
  #length
    returns 0 for []
    returns 1 for ["A"]
    returns 3 for ["A", "B", "C"]

Immutable::Set
  #sort
    on []
      with a block
        returns []
        doesn't change the original Set
      without a block
        returns []
        doesn't change the original Set
    on ["A"]
      with a block
        returns ["A"]
        doesn't change the original Set
      without a block
        returns ["A"]
        doesn't change the original Set
    on ["Ichi", "Ni", "San"]
      with a block
        returns ["Ni", "San", "Ichi"]
        doesn't change the original Set
      without a block
        returns ["Ichi", "Ni", "San"]
        doesn't change the original Set
  #sort_by
    on []
      with a block
        returns []
        doesn't change the original Set
      without a block
        returns []
        doesn't change the original Set
    on ["A"]
      with a block
        returns ["A"]
        doesn't change the original Set
      without a block
        returns ["A"]
        doesn't change the original Set
    on ["Ichi", "Ni", "San"]
      with a block
        returns ["Ni", "San", "Ichi"]
        doesn't change the original Set
      without a block
        returns ["Ichi", "Ni", "San"]
        doesn't change the original Set
  #sort_by
    calls the passed block no more than twice for each item

Immutable::Set
  #subset?
    for [] and []
      returns true
    for ["A"] and []
      returns false
    for [] and ["A"]
      returns true
    for ["A"] and ["A"]
      returns true
    for ["A", "B", "C"] and ["B"]
      returns false
    for ["B"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "C"]
      returns false
    for ["A", "C"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "B", "C", "D"]
      returns true
    for ["A", "B", "C", "D"] and ["A", "B", "C"]
      returns false
  #<=
    for [] and []
      returns true
    for ["A"] and []
      returns false
    for [] and ["A"]
      returns true
    for ["A"] and ["A"]
      returns true
    for ["A", "B", "C"] and ["B"]
      returns false
    for ["B"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "C"]
      returns false
    for ["A", "C"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "B", "C", "D"]
      returns true
    for ["A", "B", "C", "D"] and ["A", "B", "C"]
      returns false
  #proper_subset?
    for [] and []
      returns false
    for ["A"] and []
      returns false
    for [] and ["A"]
      returns true
    for ["A"] and ["A"]
      returns false
    for ["A", "B", "C"] and ["B"]
      returns false
    for ["B"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "C"]
      returns false
    for ["A", "C"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "B", "C", "D"]
      returns true
    for ["A", "B", "C", "D"] and ["A", "B", "C"]
      returns false
  #<
    for [] and []
      returns false
    for ["A"] and []
      returns false
    for [] and ["A"]
      returns true
    for ["A"] and ["A"]
      returns false
    for ["A", "B", "C"] and ["B"]
      returns false
    for ["B"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "C"]
      returns false
    for ["A", "C"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "B", "C", "D"]
      returns true
    for ["A", "B", "C", "D"] and ["A", "B", "C"]
      returns false

Immutable::Set
  #sum
    on []
      returns 0
      doesn't change the original Set
    on [2]
      returns 2
      doesn't change the original Set
    on [1, 3, 5, 7, 11]
      returns 27
      doesn't change the original Set

Immutable::Set
  #superset?
    for [] and []
      returns true
    for ["A"] and []
      returns true
    for [] and ["A"]
      returns false
    for ["A"] and ["A"]
      returns true
    for ["A", "B", "C"] and ["B"]
      returns true
    for ["B"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "C"]
      returns true
    for ["A", "C"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "B", "C", "D"]
      returns false
    for ["A", "B", "C", "D"] and ["A", "B", "C"]
      returns true
  #>=
    for [] and []
      returns true
    for ["A"] and []
      returns true
    for [] and ["A"]
      returns false
    for ["A"] and ["A"]
      returns true
    for ["A", "B", "C"] and ["B"]
      returns true
    for ["B"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "C"]
      returns true
    for ["A", "C"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "B", "C", "D"]
      returns false
    for ["A", "B", "C", "D"] and ["A", "B", "C"]
      returns true
  #proper_superset?
    for [] and []
      returns false
    for ["A"] and []
      returns true
    for [] and ["A"]
      returns false
    for ["A"] and ["A"]
      returns false
    for ["A", "B", "C"] and ["B"]
      returns true
    for ["B"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "C"]
      returns true
    for ["A", "C"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "B", "C", "D"]
      returns false
    for ["A", "B", "C", "D"] and ["A", "B", "C"]
      returns true
  #>
    for [] and []
      returns false
    for ["A"] and []
      returns true
    for [] and ["A"]
      returns false
    for ["A"] and ["A"]
      returns false
    for ["A", "B", "C"] and ["B"]
      returns true
    for ["B"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "C"]
      returns true
    for ["A", "C"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "B", "C", "D"]
      returns false
    for ["A", "B", "C", "D"] and ["A", "B", "C"]
      returns true

Immutable::Set
  #to_a
    on 'a'..'a'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'b'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'c'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'d'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'e'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'f'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'g'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'h'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'i'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'j'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'k'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'l'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'m'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'n'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'o'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'p'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'q'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'r'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'s'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'t'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'u'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'v'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'w'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'x'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'y'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'z'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
  #entries
    on 'a'..'a'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'b'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'c'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'d'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'e'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'f'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'g'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'h'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'i'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'j'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'k'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'l'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'m'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'n'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'o'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'p'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'q'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'r'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'s'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'t'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'u'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'v'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'w'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'x'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'y'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'z'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array

Immutable::Set
  #to_list
    on []
      returns a list
      doesn't change the original Set
      the returned list
        has the correct length
        contains all values
    on ["A"]
      returns a list
      doesn't change the original Set
      the returned list
        has the correct length
        contains all values
    on ["A", "B", "C"]
      returns a list
      doesn't change the original Set
      the returned list
        has the correct length
        contains all values

Immutable::Set
  #to_set
    on []
      returns self
    on ["A"]
      returns self
    on ["A", "B", "C"]
      returns self

Immutable::Set
  #union
    for [] and []
      returns [], without changing the original Sets
    for [] and []
      returns [], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A"] and []
      returns ["A"], without changing the original Sets
    for [] and ["A"]
      returns ["A"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A"] and ["A"]
      returns ["A"], without changing the original Sets
    for ["A"] and ["A"]
      returns ["A"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for [] and ["A"]
      returns ["A"], without changing the original Sets
    for ["A"] and []
      returns ["A"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A", "B", "C"] and []
      returns ["A", "B", "C"], without changing the original Sets
    for [] and ["A", "B", "C"]
      returns ["A", "B", "C"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns ["A", "B", "C"], without changing the original Sets
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns ["A", "B", "C"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A", "B", "C"] and ["X", "Y", "Z"]
      returns ["A", "B", "C", "X", "Y", "Z"], without changing the original Sets
    for ["X", "Y", "Z"] and ["A", "B", "C"]
      returns ["A", "B", "C", "X", "Y", "Z"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    when receiving a subset
      returns self
  #|
    for [] and []
      returns [], without changing the original Sets
    for [] and []
      returns [], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A"] and []
      returns ["A"], without changing the original Sets
    for [] and ["A"]
      returns ["A"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A"] and ["A"]
      returns ["A"], without changing the original Sets
    for ["A"] and ["A"]
      returns ["A"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for [] and ["A"]
      returns ["A"], without changing the original Sets
    for ["A"] and []
      returns ["A"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A", "B", "C"] and []
      returns ["A", "B", "C"], without changing the original Sets
    for [] and ["A", "B", "C"]
      returns ["A", "B", "C"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns ["A", "B", "C"], without changing the original Sets
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns ["A", "B", "C"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A", "B", "C"] and ["X", "Y", "Z"]
      returns ["A", "B", "C", "X", "Y", "Z"], without changing the original Sets
    for ["X", "Y", "Z"] and ["A", "B", "C"]
      returns ["A", "B", "C", "X", "Y", "Z"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    when receiving a subset
      returns self
  #+
    for [] and []
      returns [], without changing the original Sets
    for [] and []
      returns [], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A"] and []
      returns ["A"], without changing the original Sets
    for [] and ["A"]
      returns ["A"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A"] and ["A"]
      returns ["A"], without changing the original Sets
    for ["A"] and ["A"]
      returns ["A"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for [] and ["A"]
      returns ["A"], without changing the original Sets
    for ["A"] and []
      returns ["A"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A", "B", "C"] and []
      returns ["A", "B", "C"], without changing the original Sets
    for [] and ["A", "B", "C"]
      returns ["A", "B", "C"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns ["A", "B", "C"], without changing the original Sets
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns ["A", "B", "C"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A", "B", "C"] and ["X", "Y", "Z"]
      returns ["A", "B", "C", "X", "Y", "Z"], without changing the original Sets
    for ["X", "Y", "Z"] and ["A", "B", "C"]
      returns ["A", "B", "C", "X", "Y", "Z"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    when receiving a subset
      returns self
  #merge
    for [] and []
      returns [], without changing the original Sets
    for [] and []
      returns [], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A"] and []
      returns ["A"], without changing the original Sets
    for [] and ["A"]
      returns ["A"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A"] and ["A"]
      returns ["A"], without changing the original Sets
    for ["A"] and ["A"]
      returns ["A"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for [] and ["A"]
      returns ["A"], without changing the original Sets
    for ["A"] and []
      returns ["A"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A", "B", "C"] and []
      returns ["A", "B", "C"], without changing the original Sets
    for [] and ["A", "B", "C"]
      returns ["A", "B", "C"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns ["A", "B", "C"], without changing the original Sets
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns ["A", "B", "C"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A", "B", "C"] and ["X", "Y", "Z"]
      returns ["A", "B", "C", "X", "Y", "Z"], without changing the original Sets
    for ["X", "Y", "Z"] and ["A", "B", "C"]
      returns ["A", "B", "C", "X", "Y", "Z"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    when receiving a subset
      returns self

Immutable::SortedSet
  #above
    when called without a block
      returns a sorted set of all items higher than the argument
    when called with a block
      yields all the items higher than the argument
    on an empty set
      returns an empty set
    with an argument higher than all the values in the set
      returns an empty set

Immutable::SortedSet
  #add
    with a unique value
      preserves the original
      returns a copy with the superset of values (in order)
    with a duplicate value
      preserves the original values
      returns self
    on a set ordered by a comparator
      inserts the new item in the correct place
  #<<
    with a unique value
      preserves the original
      returns a copy with the superset of values (in order)
    with a duplicate value
      preserves the original values
      returns self
    on a set ordered by a comparator
      inserts the new item in the correct place
  #add?
    with a unique value
      preserves the original
      returns a copy with the superset of values
    with a duplicate value
      preserves the original values
      returns false

Immutable::SortedSet
  #at
    [] with 10
      returns nil
    ["A"] with 10
      returns nil
    ["A", "B", "C"] with 0
      returns "A"
    ["A", "B", "C"] with 1
      returns "B"
    ["A", "B", "C"] with 2
      returns "C"
    ["A", "B", "C"] with 3
      returns nil
    ["A", "B", "C"] with -1
      returns "C"
    ["A", "B", "C"] with -2
      returns "B"
    ["A", "B", "C"] with -3
      returns "A"
    ["A", "B", "C"] with -4
      returns nil

Immutable::SortedSet
  #below
    when called without a block
      returns a sorted set of all items lower than the argument
    when called with a block
      yields all the items lower than the argument
    on an empty set
      returns an empty set
    with an argument lower than all the values in the set
      returns an empty set

Immutable::SortedSet
  #between
    when called without a block
      returns a sorted set of all items from the first argument to the second
    when called with a block
      yields all the items lower than the argument
    on an empty set
      returns an empty set
    with a 'to' argument lower than the 'from' argument
      returns an empty set

Immutable::SortedSet
  #clear
    on []
      preserves the original
      returns an empty set
    on ["A"]
      preserves the original
      returns an empty set
    on ["A", "B", "C"]
      preserves the original
      returns an empty set
    from a subclass
      returns an empty instance of the subclass
    with a comparator
      returns an empty instance with same comparator

Immutable::SortedSet
  on []
    returns self
  on ["A"]
    returns self
  on ["A", "B", "C"]
    returns self
  on 1..32
    returns self
  on []
    returns self
  on ["A"]
    returns self
  on ["A", "B", "C"]
    returns self
  on 1..32
    returns self

Immutable::SortedSet
  #delete_at
    removes the element at the specified index
    makes no modification if the index is out of range

Immutable::SortedSet
  #delete
    on an empty set
      returns an empty set
    with an existing value
      preserves the original
      returns a copy with the remaining of values
    with a non-existing value
      preserves the original values
      returns self
    when removing the last value in a sorted set
      maintains the set order
      when the set is in natural order
        returns the canonical empty set
    on [1, 2, 3], when deleting [1, 2, 3]
      returns []
    on [1, 2, 3, 4], when deleting [1, 2, 3]
      returns [4]
    on [1, 2, 3, 4], when deleting [1, 2, 4]
      returns [3]
    on [1, 2, 3, 4], when deleting [1, 3, 4]
      returns [2]
    on [1, 2, 3, 4], when deleting [2, 3, 4]
      returns [1]
    on [1, 2, 3, 4, 5], when deleting [1, 2, 3]
      returns [4, 5]
    on [1, 2, 3, 4, 5], when deleting [1, 2, 4]
      returns [3, 5]
    on [1, 2, 3, 4, 5], when deleting [1, 2, 5]
      returns [3, 4]
    on [1, 2, 3, 4, 5], when deleting [1, 3, 4]
      returns [2, 5]
    on [1, 2, 3, 4, 5], when deleting [1, 3, 5]
      returns [2, 4]
    on [1, 2, 3, 4, 5], when deleting [1, 4, 5]
      returns [2, 3]
    on [1, 2, 3, 4, 5], when deleting [2, 3, 4]
      returns [1, 5]
    on [1, 2, 3, 4, 5], when deleting [2, 3, 5]
      returns [1, 4]
    on [1, 2, 3, 4, 5], when deleting [2, 4, 5]
      returns [1, 3]
    on [1, 2, 3, 4, 5], when deleting [3, 4, 5]
      returns [1, 2]
    on [1, 2, 3, 4, 5, 6], when deleting [1, 2, 3]
      returns [4, 5, 6]
    on [1, 2, 3, 4, 5, 6], when deleting [1, 2, 4]
      returns [3, 5, 6]
    on [1, 2, 3, 4, 5, 6], when deleting [1, 2, 5]
      returns [3, 4, 6]
    on [1, 2, 3, 4, 5, 6], when deleting [1, 2, 6]
      returns [3, 4, 5]
    on [1, 2, 3, 4, 5, 6], when deleting [1, 3, 4]
      returns [2, 5, 6]
    on [1, 2, 3, 4, 5, 6], when deleting [1, 3, 5]
      returns [2, 4, 6]
    on [1, 2, 3, 4, 5, 6], when deleting [1, 3, 6]
      returns [2, 4, 5]
    on [1, 2, 3, 4, 5, 6], when deleting [1, 4, 5]
      returns [2, 3, 6]
    on [1, 2, 3, 4, 5, 6], when deleting [1, 4, 6]
      returns [2, 3, 5]
    on [1, 2, 3, 4, 5, 6], when deleting [1, 5, 6]
      returns [2, 3, 4]
    on [1, 2, 3, 4, 5, 6], when deleting [2, 3, 4]
      returns [1, 5, 6]
    on [1, 2, 3, 4, 5, 6], when deleting [2, 3, 5]
      returns [1, 4, 6]
    on [1, 2, 3, 4, 5, 6], when deleting [2, 3, 6]
      returns [1, 4, 5]
    on [1, 2, 3, 4, 5, 6], when deleting [2, 4, 5]
      returns [1, 3, 6]
    on [1, 2, 3, 4, 5, 6], when deleting [2, 4, 6]
      returns [1, 3, 5]
    on [1, 2, 3, 4, 5, 6], when deleting [2, 5, 6]
      returns [1, 3, 4]
    on [1, 2, 3, 4, 5, 6], when deleting [3, 4, 5]
      returns [1, 2, 6]
    on [1, 2, 3, 4, 5, 6], when deleting [3, 4, 6]
      returns [1, 2, 5]
    on [1, 2, 3, 4, 5, 6], when deleting [3, 5, 6]
      returns [1, 2, 4]
    on [1, 2, 3, 4, 5, 6], when deleting [4, 5, 6]
      returns [1, 2, 3]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [1, 2, 3]
      returns [4, 5, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [1, 2, 4]
      returns [3, 5, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [1, 2, 5]
      returns [3, 4, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [1, 2, 6]
      returns [3, 4, 5, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [1, 2, 7]
      returns [3, 4, 5, 6]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [1, 3, 4]
      returns [2, 5, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [1, 3, 5]
      returns [2, 4, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [1, 3, 6]
      returns [2, 4, 5, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [1, 3, 7]
      returns [2, 4, 5, 6]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [1, 4, 5]
      returns [2, 3, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [1, 4, 6]
      returns [2, 3, 5, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [1, 4, 7]
      returns [2, 3, 5, 6]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [1, 5, 6]
      returns [2, 3, 4, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [1, 5, 7]
      returns [2, 3, 4, 6]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [1, 6, 7]
      returns [2, 3, 4, 5]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [2, 3, 4]
      returns [1, 5, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [2, 3, 5]
      returns [1, 4, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [2, 3, 6]
      returns [1, 4, 5, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [2, 3, 7]
      returns [1, 4, 5, 6]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [2, 4, 5]
      returns [1, 3, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [2, 4, 6]
      returns [1, 3, 5, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [2, 4, 7]
      returns [1, 3, 5, 6]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [2, 5, 6]
      returns [1, 3, 4, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [2, 5, 7]
      returns [1, 3, 4, 6]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [2, 6, 7]
      returns [1, 3, 4, 5]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [3, 4, 5]
      returns [1, 2, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [3, 4, 6]
      returns [1, 2, 5, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [3, 4, 7]
      returns [1, 2, 5, 6]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [3, 5, 6]
      returns [1, 2, 4, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [3, 5, 7]
      returns [1, 2, 4, 6]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [3, 6, 7]
      returns [1, 2, 4, 5]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [4, 5, 6]
      returns [1, 2, 3, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [4, 5, 7]
      returns [1, 2, 3, 6]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [4, 6, 7]
      returns [1, 2, 3, 5]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [5, 6, 7]
      returns [1, 2, 3, 4]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 2, 3]
      returns [4, 5, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 2, 4]
      returns [3, 5, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 2, 5]
      returns [3, 4, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 2, 6]
      returns [3, 4, 5, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 2, 7]
      returns [3, 4, 5, 6, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 2, 8]
      returns [3, 4, 5, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 3, 4]
      returns [2, 5, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 3, 5]
      returns [2, 4, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 3, 6]
      returns [2, 4, 5, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 3, 7]
      returns [2, 4, 5, 6, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 3, 8]
      returns [2, 4, 5, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 4, 5]
      returns [2, 3, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 4, 6]
      returns [2, 3, 5, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 4, 7]
      returns [2, 3, 5, 6, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 4, 8]
      returns [2, 3, 5, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 5, 6]
      returns [2, 3, 4, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 5, 7]
      returns [2, 3, 4, 6, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 5, 8]
      returns [2, 3, 4, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 6, 7]
      returns [2, 3, 4, 5, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 6, 8]
      returns [2, 3, 4, 5, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 7, 8]
      returns [2, 3, 4, 5, 6]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [2, 3, 4]
      returns [1, 5, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [2, 3, 5]
      returns [1, 4, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [2, 3, 6]
      returns [1, 4, 5, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [2, 3, 7]
      returns [1, 4, 5, 6, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [2, 3, 8]
      returns [1, 4, 5, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [2, 4, 5]
      returns [1, 3, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [2, 4, 6]
      returns [1, 3, 5, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [2, 4, 7]
      returns [1, 3, 5, 6, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [2, 4, 8]
      returns [1, 3, 5, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [2, 5, 6]
      returns [1, 3, 4, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [2, 5, 7]
      returns [1, 3, 4, 6, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [2, 5, 8]
      returns [1, 3, 4, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [2, 6, 7]
      returns [1, 3, 4, 5, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [2, 6, 8]
      returns [1, 3, 4, 5, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [2, 7, 8]
      returns [1, 3, 4, 5, 6]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [3, 4, 5]
      returns [1, 2, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [3, 4, 6]
      returns [1, 2, 5, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [3, 4, 7]
      returns [1, 2, 5, 6, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [3, 4, 8]
      returns [1, 2, 5, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [3, 5, 6]
      returns [1, 2, 4, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [3, 5, 7]
      returns [1, 2, 4, 6, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [3, 5, 8]
      returns [1, 2, 4, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [3, 6, 7]
      returns [1, 2, 4, 5, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [3, 6, 8]
      returns [1, 2, 4, 5, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [3, 7, 8]
      returns [1, 2, 4, 5, 6]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [4, 5, 6]
      returns [1, 2, 3, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [4, 5, 7]
      returns [1, 2, 3, 6, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [4, 5, 8]
      returns [1, 2, 3, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [4, 6, 7]
      returns [1, 2, 3, 5, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [4, 6, 8]
      returns [1, 2, 3, 5, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [4, 7, 8]
      returns [1, 2, 3, 5, 6]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [5, 6, 7]
      returns [1, 2, 3, 4, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [5, 6, 8]
      returns [1, 2, 3, 4, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [5, 7, 8]
      returns [1, 2, 3, 4, 6]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [6, 7, 8]
      returns [1, 2, 3, 4, 5]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 2, 3]
      returns [4, 5, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 2, 4]
      returns [3, 5, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 2, 5]
      returns [3, 4, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 2, 6]
      returns [3, 4, 5, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 2, 7]
      returns [3, 4, 5, 6, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 2, 8]
      returns [3, 4, 5, 6, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 2, 9]
      returns [3, 4, 5, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 3, 4]
      returns [2, 5, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 3, 5]
      returns [2, 4, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 3, 6]
      returns [2, 4, 5, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 3, 7]
      returns [2, 4, 5, 6, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 3, 8]
      returns [2, 4, 5, 6, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 3, 9]
      returns [2, 4, 5, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 4, 5]
      returns [2, 3, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 4, 6]
      returns [2, 3, 5, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 4, 7]
      returns [2, 3, 5, 6, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 4, 8]
      returns [2, 3, 5, 6, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 4, 9]
      returns [2, 3, 5, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 5, 6]
      returns [2, 3, 4, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 5, 7]
      returns [2, 3, 4, 6, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 5, 8]
      returns [2, 3, 4, 6, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 5, 9]
      returns [2, 3, 4, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 6, 7]
      returns [2, 3, 4, 5, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 6, 8]
      returns [2, 3, 4, 5, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 6, 9]
      returns [2, 3, 4, 5, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 7, 8]
      returns [2, 3, 4, 5, 6, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 7, 9]
      returns [2, 3, 4, 5, 6, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 8, 9]
      returns [2, 3, 4, 5, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 3, 4]
      returns [1, 5, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 3, 5]
      returns [1, 4, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 3, 6]
      returns [1, 4, 5, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 3, 7]
      returns [1, 4, 5, 6, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 3, 8]
      returns [1, 4, 5, 6, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 3, 9]
      returns [1, 4, 5, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 4, 5]
      returns [1, 3, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 4, 6]
      returns [1, 3, 5, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 4, 7]
      returns [1, 3, 5, 6, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 4, 8]
      returns [1, 3, 5, 6, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 4, 9]
      returns [1, 3, 5, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 5, 6]
      returns [1, 3, 4, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 5, 7]
      returns [1, 3, 4, 6, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 5, 8]
      returns [1, 3, 4, 6, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 5, 9]
      returns [1, 3, 4, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 6, 7]
      returns [1, 3, 4, 5, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 6, 8]
      returns [1, 3, 4, 5, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 6, 9]
      returns [1, 3, 4, 5, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 7, 8]
      returns [1, 3, 4, 5, 6, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 7, 9]
      returns [1, 3, 4, 5, 6, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 8, 9]
      returns [1, 3, 4, 5, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [3, 4, 5]
      returns [1, 2, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [3, 4, 6]
      returns [1, 2, 5, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [3, 4, 7]
      returns [1, 2, 5, 6, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [3, 4, 8]
      returns [1, 2, 5, 6, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [3, 4, 9]
      returns [1, 2, 5, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [3, 5, 6]
      returns [1, 2, 4, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [3, 5, 7]
      returns [1, 2, 4, 6, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [3, 5, 8]
      returns [1, 2, 4, 6, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [3, 5, 9]
      returns [1, 2, 4, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [3, 6, 7]
      returns [1, 2, 4, 5, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [3, 6, 8]
      returns [1, 2, 4, 5, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [3, 6, 9]
      returns [1, 2, 4, 5, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [3, 7, 8]
      returns [1, 2, 4, 5, 6, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [3, 7, 9]
      returns [1, 2, 4, 5, 6, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [3, 8, 9]
      returns [1, 2, 4, 5, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [4, 5, 6]
      returns [1, 2, 3, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [4, 5, 7]
      returns [1, 2, 3, 6, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [4, 5, 8]
      returns [1, 2, 3, 6, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [4, 5, 9]
      returns [1, 2, 3, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [4, 6, 7]
      returns [1, 2, 3, 5, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [4, 6, 8]
      returns [1, 2, 3, 5, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [4, 6, 9]
      returns [1, 2, 3, 5, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [4, 7, 8]
      returns [1, 2, 3, 5, 6, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [4, 7, 9]
      returns [1, 2, 3, 5, 6, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [4, 8, 9]
      returns [1, 2, 3, 5, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [5, 6, 7]
      returns [1, 2, 3, 4, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [5, 6, 8]
      returns [1, 2, 3, 4, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [5, 6, 9]
      returns [1, 2, 3, 4, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [5, 7, 8]
      returns [1, 2, 3, 4, 6, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [5, 7, 9]
      returns [1, 2, 3, 4, 6, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [5, 8, 9]
      returns [1, 2, 3, 4, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [6, 7, 8]
      returns [1, 2, 3, 4, 5, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [6, 7, 9]
      returns [1, 2, 3, 4, 5, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [6, 8, 9]
      returns [1, 2, 3, 4, 5, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [7, 8, 9]
      returns [1, 2, 3, 4, 5, 6]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 2, 3]
      returns [4, 5, 6, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 2, 4]
      returns [3, 5, 6, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 2, 5]
      returns [3, 4, 6, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 2, 6]
      returns [3, 4, 5, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 2, 7]
      returns [3, 4, 5, 6, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 2, 8]
      returns [3, 4, 5, 6, 7, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 2, 9]
      returns [3, 4, 5, 6, 7, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 2, 10]
      returns [3, 4, 5, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 3, 4]
      returns [2, 5, 6, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 3, 5]
      returns [2, 4, 6, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 3, 6]
      returns [2, 4, 5, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 3, 7]
      returns [2, 4, 5, 6, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 3, 8]
      returns [2, 4, 5, 6, 7, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 3, 9]
      returns [2, 4, 5, 6, 7, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 3, 10]
      returns [2, 4, 5, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 4, 5]
      returns [2, 3, 6, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 4, 6]
      returns [2, 3, 5, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 4, 7]
      returns [2, 3, 5, 6, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 4, 8]
      returns [2, 3, 5, 6, 7, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 4, 9]
      returns [2, 3, 5, 6, 7, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 4, 10]
      returns [2, 3, 5, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 5, 6]
      returns [2, 3, 4, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 5, 7]
      returns [2, 3, 4, 6, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 5, 8]
      returns [2, 3, 4, 6, 7, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 5, 9]
      returns [2, 3, 4, 6, 7, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 5, 10]
      returns [2, 3, 4, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 6, 7]
      returns [2, 3, 4, 5, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 6, 8]
      returns [2, 3, 4, 5, 7, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 6, 9]
      returns [2, 3, 4, 5, 7, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 6, 10]
      returns [2, 3, 4, 5, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 7, 8]
      returns [2, 3, 4, 5, 6, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 7, 9]
      returns [2, 3, 4, 5, 6, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 7, 10]
      returns [2, 3, 4, 5, 6, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 8, 9]
      returns [2, 3, 4, 5, 6, 7, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 8, 10]
      returns [2, 3, 4, 5, 6, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 9, 10]
      returns [2, 3, 4, 5, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 3, 4]
      returns [1, 5, 6, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 3, 5]
      returns [1, 4, 6, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 3, 6]
      returns [1, 4, 5, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 3, 7]
      returns [1, 4, 5, 6, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 3, 8]
      returns [1, 4, 5, 6, 7, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 3, 9]
      returns [1, 4, 5, 6, 7, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 3, 10]
      returns [1, 4, 5, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 4, 5]
      returns [1, 3, 6, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 4, 6]
      returns [1, 3, 5, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 4, 7]
      returns [1, 3, 5, 6, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 4, 8]
      returns [1, 3, 5, 6, 7, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 4, 9]
      returns [1, 3, 5, 6, 7, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 4, 10]
      returns [1, 3, 5, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 5, 6]
      returns [1, 3, 4, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 5, 7]
      returns [1, 3, 4, 6, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 5, 8]
      returns [1, 3, 4, 6, 7, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 5, 9]
      returns [1, 3, 4, 6, 7, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 5, 10]
      returns [1, 3, 4, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 6, 7]
      returns [1, 3, 4, 5, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 6, 8]
      returns [1, 3, 4, 5, 7, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 6, 9]
      returns [1, 3, 4, 5, 7, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 6, 10]
      returns [1, 3, 4, 5, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 7, 8]
      returns [1, 3, 4, 5, 6, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 7, 9]
      returns [1, 3, 4, 5, 6, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 7, 10]
      returns [1, 3, 4, 5, 6, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 8, 9]
      returns [1, 3, 4, 5, 6, 7, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 8, 10]
      returns [1, 3, 4, 5, 6, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 9, 10]
      returns [1, 3, 4, 5, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 4, 5]
      returns [1, 2, 6, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 4, 6]
      returns [1, 2, 5, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 4, 7]
      returns [1, 2, 5, 6, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 4, 8]
      returns [1, 2, 5, 6, 7, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 4, 9]
      returns [1, 2, 5, 6, 7, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 4, 10]
      returns [1, 2, 5, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 5, 6]
      returns [1, 2, 4, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 5, 7]
      returns [1, 2, 4, 6, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 5, 8]
      returns [1, 2, 4, 6, 7, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 5, 9]
      returns [1, 2, 4, 6, 7, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 5, 10]
      returns [1, 2, 4, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 6, 7]
      returns [1, 2, 4, 5, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 6, 8]
      returns [1, 2, 4, 5, 7, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 6, 9]
      returns [1, 2, 4, 5, 7, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 6, 10]
      returns [1, 2, 4, 5, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 7, 8]
      returns [1, 2, 4, 5, 6, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 7, 9]
      returns [1, 2, 4, 5, 6, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 7, 10]
      returns [1, 2, 4, 5, 6, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 8, 9]
      returns [1, 2, 4, 5, 6, 7, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 8, 10]
      returns [1, 2, 4, 5, 6, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 9, 10]
      returns [1, 2, 4, 5, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [4, 5, 6]
      returns [1, 2, 3, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [4, 5, 7]
      returns [1, 2, 3, 6, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [4, 5, 8]
      returns [1, 2, 3, 6, 7, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [4, 5, 9]
      returns [1, 2, 3, 6, 7, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [4, 5, 10]
      returns [1, 2, 3, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [4, 6, 7]
      returns [1, 2, 3, 5, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [4, 6, 8]
      returns [1, 2, 3, 5, 7, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [4, 6, 9]
      returns [1, 2, 3, 5, 7, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [4, 6, 10]
      returns [1, 2, 3, 5, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [4, 7, 8]
      returns [1, 2, 3, 5, 6, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [4, 7, 9]
      returns [1, 2, 3, 5, 6, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [4, 7, 10]
      returns [1, 2, 3, 5, 6, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [4, 8, 9]
      returns [1, 2, 3, 5, 6, 7, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [4, 8, 10]
      returns [1, 2, 3, 5, 6, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [4, 9, 10]
      returns [1, 2, 3, 5, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [5, 6, 7]
      returns [1, 2, 3, 4, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [5, 6, 8]
      returns [1, 2, 3, 4, 7, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [5, 6, 9]
      returns [1, 2, 3, 4, 7, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [5, 6, 10]
      returns [1, 2, 3, 4, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [5, 7, 8]
      returns [1, 2, 3, 4, 6, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [5, 7, 9]
      returns [1, 2, 3, 4, 6, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [5, 7, 10]
      returns [1, 2, 3, 4, 6, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [5, 8, 9]
      returns [1, 2, 3, 4, 6, 7, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [5, 8, 10]
      returns [1, 2, 3, 4, 6, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [5, 9, 10]
      returns [1, 2, 3, 4, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [6, 7, 8]
      returns [1, 2, 3, 4, 5, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [6, 7, 9]
      returns [1, 2, 3, 4, 5, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [6, 7, 10]
      returns [1, 2, 3, 4, 5, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [6, 8, 9]
      returns [1, 2, 3, 4, 5, 7, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [6, 8, 10]
      returns [1, 2, 3, 4, 5, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [6, 9, 10]
      returns [1, 2, 3, 4, 5, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [7, 8, 9]
      returns [1, 2, 3, 4, 5, 6, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [7, 8, 10]
      returns [1, 2, 3, 4, 5, 6, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [7, 9, 10]
      returns [1, 2, 3, 4, 5, 6, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [8, 9, 10]
      returns [1, 2, 3, 4, 5, 6, 7]
  #delete?
    with an existing value
      preserves the original
      returns a copy with the remaining values
    with a non-existing value
      preserves the original values
      returns false

Immutable::SortedSet
  #difference
    for [] and []
      returns []
    for ["A"] and []
      returns ["A"]
    for ["A"] and ["A"]
      returns []
    for ["A", "B", "C"] and ["B"]
      returns ["A", "C"]
    for ["A", "B", "C"] and ["A", "C"]
      returns ["B"]
    for ["A", "B", "C", "D", "E", "F"] and ["B", "E", "F", "G", "M", "X"]
      returns ["A", "C", "D"]
  #subtract
    for [] and []
      returns []
    for ["A"] and []
      returns ["A"]
    for ["A"] and ["A"]
      returns []
    for ["A", "B", "C"] and ["B"]
      returns ["A", "C"]
    for ["A", "B", "C"] and ["A", "C"]
      returns ["B"]
    for ["A", "B", "C", "D", "E", "F"] and ["B", "E", "F", "G", "M", "X"]
      returns ["A", "C", "D"]
  #-
    for [] and []
      returns []
    for ["A"] and []
      returns ["A"]
    for ["A"] and ["A"]
      returns []
    for ["A", "B", "C"] and ["B"]
      returns ["A", "C"]
    for ["A", "B", "C"] and ["A", "C"]
      returns ["B"]
    for ["A", "B", "C", "D", "E", "F"] and ["B", "E", "F", "G", "M", "X"]
      returns ["A", "C", "D"]

Immutable::SortedSet
  #disjoint?
    for [] and []
      returns true
    for ["A"] and []
      returns true
    for [] and ["A"]
      returns true
    for ["A"] and ["A"]
      returns false
    for ["A", "B", "C"] and ["B"]
      returns false
    for ["B"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["D", "E"]
      returns true
    for ["F", "G", "H", "I"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "B", "C", "D"]
      returns false
    for ["D", "E", "F", "G"] and ["A", "B", "C"]
      returns true

Immutable::SortedSet
  #drop
    0 from []
      preserves the original
      returns []
    10 from []
      preserves the original
      returns []
    10 from ["A"]
      preserves the original
      returns []
    0 from ["A", "B", "C"]
      preserves the original
      returns ["A", "B", "C"]
    1 from ["A", "B", "C"]
      preserves the original
      returns ["B", "C"]
    2 from ["A", "B", "C"]
      preserves the original
      returns ["C"]
    3 from ["A", "B", "C"]
      preserves the original
      returns []
    when argument is zero
      returns self
    when the set has a custom order
      maintains the custom order
      keeps the comparator even when set is cleared
    when called on a subclass
      should return an instance of the subclass

Immutable::SortedSet
  #drop_while
    on []
      with a block
        preserves the original
        returns []
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        preserves the original
        returns []
      without a block
        returns an Enumerator
    on ["A", "B", "C"]
      with a block
        preserves the original
        returns ["C"]
      without a block
        returns an Enumerator
    on ["A", "B", "C", "D", "E", "F", "G"]
      with a block
        preserves the original
        returns ["C", "D", "E", "F", "G"]
      without a block
        returns an Enumerator

Immutable::SortedSet
  #each
    with no block
      returns an Enumerator
    with a block
      returns self
      iterates over the items in order

Immutable::SortedSet
  #empty?
    on []
      returns true
    on ["A"]
      returns false
    on ["A", "B", "C"]
      returns false
  .empty
    returns the canonical empty set
    from a subclass
      returns an empty instance of the subclass

Immutable::SortedSet
  #eql?
    when comparing to a standard set
      returns false
    when comparing to a arbitrary object
      returns false
    when comparing to an Immutable::Set
      returns false
    when comparing with a subclass of Immutable::SortedSet
      returns false
    with an empty set for each comparison
      returns true
    with an empty set and a set with nil
      returns false
    with a single item array and empty array
      returns false
    with matching single item array
      returns true
    with mismatching single item array
      returns false
    with a multi-item array and single item array
      returns false
    with matching multi-item array
      returns true
    with a mismatching multi-item array
      returns true
    with the same values, but a different sort order
      returns false

Immutable::SortedSet
  #exclusion
    for [] and []
      returns []
    for ["A"] and []
      returns ["A"]
    for ["A"] and ["A"]
      returns []
    for ["A", "B", "C"] and ["B"]
      returns ["A", "C"]
    for ["A", "B", "C"] and ["B", "C", "D"]
      returns ["A", "D"]
    for ["A", "B", "C"] and ["D", "E", "F"]
      returns ["A", "B", "C", "D", "E", "F"]
  #^
    for [] and []
      returns []
    for ["A"] and []
      returns ["A"]
    for ["A"] and ["A"]
      returns []
    for ["A", "B", "C"] and ["B"]
      returns ["A", "C"]
    for ["A", "B", "C"] and ["B", "C", "D"]
      returns ["A", "D"]
    for ["A", "B", "C"] and ["D", "E", "F"]
      returns ["A", "B", "C", "D", "E", "F"]

Immutable::SortedSet
  #fetch
    gives precedence to default block over default argument if passed both
    with no default provided
      when the index exists
        returns the value at the index
      when the key does not exist
        raises an IndexError
    with a default value
      when the index exists
        returns the value at the index
      when the index does not exist
        returns the default value
    with a default block
      when the index exists
        returns the value at the index
      when the index does not exist
        invokes the block with the missing index as parameter

Immutable::SortedSet
  #find_index
    looking for "A" in [] without block
      returns nil
    looking for "A" in [] with block
      returns nil
    looking for nil in [] with block
      returns nil
    looking for "A" in ["A"] without block
      returns 0
    looking for "A" in ["A"] with block
      returns 0
    looking for "B" in ["A"] without block
      returns nil
    looking for "B" in ["A"] with block
      returns nil
    looking for nil in ["A"] with block
      returns nil
    looking for "A" in ["A", "B", "C"] without block
      returns 0
    looking for "A" in ["A", "B", "C"] with block
      returns 0
    looking for "B" in ["A", "B", "C"] without block
      returns 1
    looking for "B" in ["A", "B", "C"] with block
      returns 1
    looking for "C" in ["A", "B", "C"] without block
      returns 2
    looking for "C" in ["A", "B", "C"] with block
      returns 2
    looking for "D" in ["A", "B", "C"] without block
      returns nil
    looking for "D" in ["A", "B", "C"] with block
      returns nil
    looking for 1 in 0..1 without block
      returns 1
    looking for 1 in 0..1 with block
      returns 1
    looking for 5 in 0..10 without block
      returns 5
    looking for 5 in 0..10 with block
      returns 5
    looking for 10 in 0..10 without block
      returns 10
    looking for 10 in 0..10 with block
      returns 10
    looking for 2 in [2] without block
      returns 0
    looking for 2 in [2] with block
      returns 0
    looking for 2.0 in [2] without block
      returns 0
    looking for 2.0 in [2] with block
      returns 0
    looking for 2.0 in [2.0] without block
      returns 0
    looking for 2.0 in [2.0] with block
      returns 0
    looking for 2 in [2.0] without block
      returns 0
    looking for 2 in [2.0] with block
      returns 0
  #index
    looking for "A" in [] without block
      returns nil
    looking for "A" in [] with block
      returns nil
    looking for nil in [] with block
      returns nil
    looking for "A" in ["A"] without block
      returns 0
    looking for "A" in ["A"] with block
      returns 0
    looking for "B" in ["A"] without block
      returns nil
    looking for "B" in ["A"] with block
      returns nil
    looking for nil in ["A"] with block
      returns nil
    looking for "A" in ["A", "B", "C"] without block
      returns 0
    looking for "A" in ["A", "B", "C"] with block
      returns 0
    looking for "B" in ["A", "B", "C"] without block
      returns 1
    looking for "B" in ["A", "B", "C"] with block
      returns 1
    looking for "C" in ["A", "B", "C"] without block
      returns 2
    looking for "C" in ["A", "B", "C"] with block
      returns 2
    looking for "D" in ["A", "B", "C"] without block
      returns nil
    looking for "D" in ["A", "B", "C"] with block
      returns nil
    looking for 1 in 0..1 without block
      returns 1
    looking for 1 in 0..1 with block
      returns 1
    looking for 5 in 0..10 without block
      returns 5
    looking for 5 in 0..10 with block
      returns 5
    looking for 10 in 0..10 without block
      returns 10
    looking for 10 in 0..10 with block
      returns 10
    looking for 2 in [2] without block
      returns 0
    looking for 2 in [2] with block
      returns 0
    looking for 2.0 in [2] without block
      returns 0
    looking for 2.0 in [2] with block
      returns 0
    looking for 2.0 in [2.0] without block
      returns 0
    looking for 2.0 in [2.0] with block
      returns 0
    looking for 2 in [2.0] without block
      returns 0
    looking for 2 in [2.0] with block
      returns 0

Immutable::SortedSet
  #first
    on []
      returns nil
    on ["A"]
      returns "A"
    on ["A", "B", "C"]
      returns "A"
    on ["Z", "Y", "X"]
      returns "X"

Immutable::SortedSet
  #from
    when called without a block
      returns a sorted set of all items equal to or greater than the argument
    when called with a block
      yields all the items equal to or greater than than the argument
    on an empty set
      returns an empty set
    with an argument higher than all the values in the set
      returns an empty set

Immutable::SortedSet
  #group_by
    with a block
      on []
        preserves the original
        returns []
      on [1]
        preserves the original
        returns [{true=>Immutable::SortedSet[1]}]
      on [1, 2, 3, 4]
        preserves the original
        returns [{true=>Immutable::SortedSet[1, 3], false=>Immutable::SortedSet[2, 4]}]
    without a block
      on []
        preserves the original
        returns []
      on [1]
        preserves the original
        returns [{1=>Immutable::SortedSet[1]}]
      on [1, 2, 3, 4]
        preserves the original
        returns [{1=>Immutable::SortedSet[1], 2=>Immutable::SortedSet[2], 3=>Immutable::SortedSet[3], 4=>Immutable::SortedSet[4]}]
    from a subclass
      returns an Hash whose values are instances of the subclass
  #group
    with a block
      on []
        preserves the original
        returns []
      on [1]
        preserves the original
        returns [{true=>Immutable::SortedSet[1]}]
      on [1, 2, 3, 4]
        preserves the original
        returns [{true=>Immutable::SortedSet[1, 3], false=>Immutable::SortedSet[2, 4]}]
    without a block
      on []
        preserves the original
        returns []
      on [1]
        preserves the original
        returns [{1=>Immutable::SortedSet[1]}]
      on [1, 2, 3, 4]
        preserves the original
        returns [{1=>Immutable::SortedSet[1], 2=>Immutable::SortedSet[2], 3=>Immutable::SortedSet[3], 4=>Immutable::SortedSet[4]}]
    from a subclass
      returns an Hash whose values are instances of the subclass
  #classify
    with a block
      on []
        preserves the original
        returns []
      on [1]
        preserves the original
        returns [{true=>Immutable::SortedSet[1]}]
      on [1, 2, 3, 4]
        preserves the original
        returns [{true=>Immutable::SortedSet[1, 3], false=>Immutable::SortedSet[2, 4]}]
    without a block
      on []
        preserves the original
        returns []
      on [1]
        preserves the original
        returns [{1=>Immutable::SortedSet[1]}]
      on [1, 2, 3, 4]
        preserves the original
        returns [{1=>Immutable::SortedSet[1], 2=>Immutable::SortedSet[2], 3=>Immutable::SortedSet[3], 4=>Immutable::SortedSet[4]}]
    from a subclass
      returns an Hash whose values are instances of the subclass

Immutable::SortedSet
  #include?
    returns true for an existing value (1)
    returns true for an existing value (2)
    returns true for an existing value (3)
    returns true for an existing value (4.0)
    returns false for a non-existing value
    uses #<=> for equality
  #member?
    returns true for an existing value (1)
    returns true for an existing value (2)
    returns true for an existing value (3)
    returns true for an existing value (4.0)
    returns false for a non-existing value
    uses #<=> for equality

Immutable::SortedSet
  #inspect
    on []
      returns "Immutable::SortedSet[]"
      returns a string which can be eval'd to get an equivalent set
    on ["A"]
      returns "Immutable::SortedSet[\"A\"]"
      returns a string which can be eval'd to get an equivalent set
    on ["C", "B", "A"]
      returns "Immutable::SortedSet[\"A\", \"B\", \"C\"]"
      returns a string which can be eval'd to get an equivalent set
    from a subclass
      returns a programmer-readable representation of the set contents
      returns a string which can be eval'd to get an equivalent set

Immutable::SortedSet
  #intersect?
    for [] and []
      returns false
    for ["A"] and []
      returns false
    for [] and ["A"]
      returns false
    for ["A"] and ["A"]
      returns true
    for ["A", "B", "C"] and ["B"]
      returns true
    for ["B"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["D", "E"]
      returns false
    for ["F", "G", "H", "I"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "B", "C", "D"]
      returns true
    for ["D", "E", "F", "G"] and ["A", "B", "C"]
      returns false

Immutable::SortedSet
  #intersection
    for [] and []
      returns []
    for [] and []
      returns []
    for ["A"] and []
      returns []
    for [] and ["A"]
      returns []
    for ["A"] and ["A"]
      returns ["A"]
    for ["A"] and ["A"]
      returns ["A"]
    for ["A", "B", "C"] and ["B"]
      returns ["B"]
    for ["B"] and ["A", "B", "C"]
      returns ["B"]
    for ["A", "B", "C"] and ["A", "C"]
      returns ["A", "C"]
    for ["A", "C"] and ["A", "B", "C"]
      returns ["A", "C"]
    for ["A", "M", "T", "X"] and ["B", "C", "D", "E", "F", "G", "H", "I", "M", "P", "Q", "T", "U"]
      returns ["M", "T"]
    for ["B", "C", "D", "E", "F", "G", "H", "I", "M", "P", "Q", "T", "U"] and ["A", "M", "T", "X"]
      returns ["M", "T"]
  #&
    for [] and []
      returns []
    for [] and []
      returns []
    for ["A"] and []
      returns []
    for [] and ["A"]
      returns []
    for ["A"] and ["A"]
      returns ["A"]
    for ["A"] and ["A"]
      returns ["A"]
    for ["A", "B", "C"] and ["B"]
      returns ["B"]
    for ["B"] and ["A", "B", "C"]
      returns ["B"]
    for ["A", "B", "C"] and ["A", "C"]
      returns ["A", "C"]
    for ["A", "C"] and ["A", "B", "C"]
      returns ["A", "C"]
    for ["A", "M", "T", "X"] and ["B", "C", "D", "E", "F", "G", "H", "I", "M", "P", "Q", "T", "U"]
      returns ["M", "T"]
    for ["B", "C", "D", "E", "F", "G", "H", "I", "M", "P", "Q", "T", "U"] and ["A", "M", "T", "X"]
      returns ["M", "T"]

Immutable::SortedSet
  #last
    with an empty set
      returns the last item
    with a single item set
      returns the last item
    with a multi-item set
      returns the last item

Immutable::SortedSet
  #map
    when empty
      returns self
    when not empty
      with a block
        preserves the original values
        returns a new set with the mapped values
        filters out duplicates
      with no block
        returns an Enumerator
    on a set ordered by a comparator
      returns a new set with the mapped values
      filters out duplicates
  #collect
    when empty
      returns self
    when not empty
      with a block
        preserves the original values
        returns a new set with the mapped values
        filters out duplicates
      with no block
        returns an Enumerator
    on a set ordered by a comparator
      returns a new set with the mapped values
      filters out duplicates

Immutable::SortedSet
  #marshal_dump/#marshal_load
    can survive dumping and loading into a new process
    is still possible to find items by index after loading
    raises a TypeError if set has a custom sort order

Immutable::SortedSet
  #max
    with a block
      on []
        returns nil
      on ["A"]
        returns "A"
      on ["Ichi", "Ni", "San"]
        returns "Ichi"
    without a block
      on []
        returns nil
      on ["A"]
        returns "A"
      on ["Ichi", "Ni", "San"]
        returns "San"

Immutable::SortedSet
  #min
    on []
      returns nil
    on ["A"]
      returns "A"
    on ["Ichi", "Ni", "San"]
      returns "Ichi"
    on [1, 2, 3, 4, 5]
      returns 1
    on [0, -0.0, 2.2, -4, -4.2]
      returns -4.2

Immutable::SortedSet
  .new
    accepts a single enumerable argument and creates a new sorted set
    also works with a Range
    doesn't mutate the initializer
    doesn't change if the initializer is later mutated
    is amenable to overriding of #initialize
    accepts a block with arity 1
    accepts a block with arity 2
    can use a block produced by Symbol#to_proc
    filters out duplicates
    when passed a comparator with arity 2
      still filters out duplicates
      still doesn't mutate the initializer
      still doesn't change if the initializer is later mutated
    when passed a block with arity 1
      still filters out duplicates
      still doesn't mutate the initializer
      still doesn't change if the initializer is later mutated
    from a subclass
      returns a frozen instance of the subclass
  .[]
    accepts a variable number of items and creates a new sorted set
    filters out duplicate items

Immutable::SortedSet
  #reverse_each
    with no block
      returns an Enumerator
    with a block
      returns self
      iterates over the items in order

Immutable::SortedSet
  #sample
    returns a randomly chosen item

Immutable::SortedSet
  #select
    when everything matches
      preserves the original
      returns self
    when only some things match
      with a block
        preserves the original
        returns a set with the matching values
      with no block
        returns an Enumerator
    when nothing matches
      preserves the original
      returns the canonical empty set
    from a subclass
      returns an instance of the same class
  #find_all
    when everything matches
      preserves the original
      returns self
    when only some things match
      with a block
        preserves the original
        returns a set with the matching values
      with no block
        returns an Enumerator
    when nothing matches
      preserves the original
      returns the canonical empty set
    from a subclass
      returns an instance of the same class

Immutable::SortedSet
  #size
    returns 0 for []
    returns 1 for ["A"]
    returns 3 for ["A", "B", "C"]
  #length
    returns 0 for []
    returns 1 for ["A"]
    returns 3 for ["A", "B", "C"]

Immutable::SortedSet
  #slice
    when passed a positive integral index
      returns the element at that index
      leaves the original unchanged
    when passed a negative integral index
      returns the element which is number (index.abs) counting from the end of the sorted_set
    when passed a positive integral index and count
      returns 'count' elements starting from 'index'
      leaves the original unchanged
    when passed a negative integral index and count
      returns 'count' elements, starting from index which is number 'index.abs' counting from the end of the array
    when passed a Range
      returns the elements whose indexes are within the given Range
      leaves the original unchanged
  when passed an empty Range
    does not lose custom sort order
  when passed a length of zero
    does not lose custom sort order
  when passed a subclass of Range
    works the same as with a Range
  on a subclass of SortedSet
    with index and count or a range, returns an instance of the subclass
  #[]
    when passed a positive integral index
      returns the element at that index
      leaves the original unchanged
    when passed a negative integral index
      returns the element which is number (index.abs) counting from the end of the sorted_set
    when passed a positive integral index and count
      returns 'count' elements starting from 'index'
      leaves the original unchanged
    when passed a negative integral index and count
      returns 'count' elements, starting from index which is number 'index.abs' counting from the end of the array
    when passed a Range
      returns the elements whose indexes are within the given Range
      leaves the original unchanged
  when passed an empty Range
    does not lose custom sort order
  when passed a length of zero
    does not lose custom sort order
  when passed a subclass of Range
    works the same as with a Range
  on a subclass of SortedSet
    with index and count or a range, returns an instance of the subclass

Immutable::SortedSet
  #sort
    on []
      with a block
        preserves the original
        returns []
      without a block
        preserves the original
        returns []
    on ["A"]
      with a block
        preserves the original
        returns ["A"]
      without a block
        preserves the original
        returns ["A"]
    on ["Ichi", "Ni", "San"]
      with a block
        preserves the original
        returns ["Ni", "San", "Ichi"]
      without a block
        preserves the original
        returns ["Ichi", "Ni", "San"]
  #sort_by
    on []
      with a block
        preserves the original
        returns []
      without a block
        preserves the original
        returns []
    on ["A"]
      with a block
        preserves the original
        returns ["A"]
      without a block
        preserves the original
        returns ["A"]
    on ["Ichi", "Ni", "San"]
      with a block
        preserves the original
        returns ["Ni", "San", "Ichi"]
      without a block
        preserves the original
        returns ["Ichi", "Ni", "San"]
  sort
    on a SortedSet with custom sort order
      returns a SortedSet with the natural sort order

Immutable::SortedSet
  #subset?
    for [] and []
      returns true
    for ["A"] and []
      returns false
    for [] and ["A"]
      returns true
    for ["A"] and ["A"]
      returns true
    for ["A", "B", "C"] and ["B"]
      returns false
    for ["B"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "C"]
      returns false
    for ["A", "C"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "B", "C", "D"]
      returns true
    for ["A", "B", "C", "D"] and ["A", "B", "C"]
      returns false
  #proper_subset?
    for [] and []
      returns false
    for ["A"] and []
      returns false
    for [] and ["A"]
      returns true
    for ["A"] and ["A"]
      returns false
    for ["A", "B", "C"] and ["B"]
      returns false
    for ["B"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "C"]
      returns false
    for ["A", "C"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "B", "C", "D"]
      returns true
    for ["A", "B", "C", "D"] and ["A", "B", "C"]
      returns false

Immutable::SortedSet
  #superset?
    for [] and []
      returns true
    for ["A"] and []
      returns true
    for [] and ["A"]
      returns false
    for ["A"] and ["A"]
      returns true
    for ["A", "B", "C"] and ["B"]
      returns true
    for ["B"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "C"]
      returns true
    for ["A", "C"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "B", "C", "D"]
      returns false
    for ["A", "B", "C", "D"] and ["A", "B", "C"]
      returns true
  #proper_superset?
    for [] and []
      returns false
    for ["A"] and []
      returns true
    for [] and ["A"]
      returns false
    for ["A"] and ["A"]
      returns false
    for ["A", "B", "C"] and ["B"]
      returns true
    for ["B"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "C"]
      returns true
    for ["A", "C"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "B", "C", "D"]
      returns false
    for ["A", "B", "C", "D"] and ["A", "B", "C"]
      returns true

Immutable::SortedSet
  #take
    10 from []
      preserves the original
      returns []
    10 from ["A"]
      preserves the original
      returns ["A"]
    0 from ["A", "B", "C"]
      preserves the original
      returns []
    2 from ["A", "B", "C"]
      preserves the original
      returns ["A", "B"]
    when argument is at least size of receiver
      returns self
    when the set has a custom order
      maintains the custom order
      keeps the comparator even when set is cleared
    when called on a subclass
      should return an instance of the subclass

Immutable::SortedSet
  #take_while
    on []
      with a block
        returns []
        preserves the original
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns ["A"]
        preserves the original
      without a block
        returns an Enumerator
    on ["A", "B", "C"]
      with a block
        returns ["A", "B"]
        preserves the original
      without a block
        returns an Enumerator

Immutable::SortedSet
  #to_set
    on []
      returns a set with the same values
    on ["A"]
      returns a set with the same values
    on ["A", "B", "C"]
      returns a set with the same values

Immutable::SortedSet
  #union
    for [] and []
      returns []
    for [] and []
      returns []
    for ["A"] and []
      returns ["A"]
    for [] and ["A"]
      returns ["A"]
    for ["A"] and ["A"]
      returns ["A"]
    for ["A"] and ["A"]
      returns ["A"]
    for ["A", "B", "C"] and []
      returns ["A", "B", "C"]
    for [] and ["A", "B", "C"]
      returns ["A", "B", "C"]
    for ["A", "C", "E", "G", "X"] and ["B", "C", "D", "E", "H", "M"]
      returns ["A", "B", "C", "D", "E", "G", "H", "M", "X"]
    for ["B", "C", "D", "E", "H", "M"] and ["A", "C", "E", "G", "X"]
      returns ["A", "B", "C", "D", "E", "G", "H", "M", "X"]
  #|
    for [] and []
      returns []
    for [] and []
      returns []
    for ["A"] and []
      returns ["A"]
    for [] and ["A"]
      returns ["A"]
    for ["A"] and ["A"]
      returns ["A"]
    for ["A"] and ["A"]
      returns ["A"]
    for ["A", "B", "C"] and []
      returns ["A", "B", "C"]
    for [] and ["A", "B", "C"]
      returns ["A", "B", "C"]
    for ["A", "C", "E", "G", "X"] and ["B", "C", "D", "E", "H", "M"]
      returns ["A", "B", "C", "D", "E", "G", "H", "M", "X"]
    for ["B", "C", "D", "E", "H", "M"] and ["A", "C", "E", "G", "X"]
      returns ["A", "B", "C", "D", "E", "G", "H", "M", "X"]
  #+
    for [] and []
      returns []
    for [] and []
      returns []
    for ["A"] and []
      returns ["A"]
    for [] and ["A"]
      returns ["A"]
    for ["A"] and ["A"]
      returns ["A"]
    for ["A"] and ["A"]
      returns ["A"]
    for ["A", "B", "C"] and []
      returns ["A", "B", "C"]
    for [] and ["A", "B", "C"]
      returns ["A", "B", "C"]
    for ["A", "C", "E", "G", "X"] and ["B", "C", "D", "E", "H", "M"]
      returns ["A", "B", "C", "D", "E", "G", "H", "M", "X"]
    for ["B", "C", "D", "E", "H", "M"] and ["A", "C", "E", "G", "X"]
      returns ["A", "B", "C", "D", "E", "G", "H", "M", "X"]
  #merge
    for [] and []
      returns []
    for [] and []
      returns []
    for ["A"] and []
      returns ["A"]
    for [] and ["A"]
      returns ["A"]
    for ["A"] and ["A"]
      returns ["A"]
    for ["A"] and ["A"]
      returns ["A"]
    for ["A", "B", "C"] and []
      returns ["A", "B", "C"]
    for [] and ["A", "B", "C"]
      returns ["A", "B", "C"]
    for ["A", "C", "E", "G", "X"] and ["B", "C", "D", "E", "H", "M"]
      returns ["A", "B", "C", "D", "E", "G", "H", "M", "X"]
    for ["B", "C", "D", "E", "H", "M"] and ["A", "C", "E", "G", "X"]
      returns ["A", "B", "C", "D", "E", "G", "H", "M", "X"]
  union
    filters out duplicates when passed an Array
    doesn't mutate an Array which is passed in
    on a set ordered by a comparator
      still filters out duplicates when passed an Array
      still doesn't mutate an Array which is passed in

Immutable::SortedSet
  #up_to
    when called without a block
      returns a sorted set of all items equal to or less than the argument
    when called with a block
      yields all the items equal to or less than than the argument
    on an empty set
      returns an empty set
    with an argument less than all the values in the set
      returns an empty set

Immutable::SortedSet
  .uniq_by_comparator!
    can handle empty arrays
    can handle arrays with 1 element
    can handle arrays with 2 elements and no dupes
    can handle arrays with 2 elements and dupes
    can handle arrays with lots of elements
    works with funny comparators

Immutable::SortedSet
  #values_at
    accepts any number of indices, and returns a sorted_set of items at those indices
    when passed invalid indices
      filters them out
    when passed no arguments
      returns an empty sorted_set
    from a subclass
      returns an instance of the subclass

Immutable::Vector
  #add
    with a empty vector adding a single item
      preserves the original
      adds the item to the vector
    with a single-item vector adding a different item
      preserves the original
      adds the item to the vector
    with a single-item vector adding a duplicate item
      preserves the original
      adds the item to the vector
    with a 31-item vector adding a different item
      preserves the original
      adds the item to the vector
    with a 32-item vector adding a different item
      preserves the original
      adds the item to the vector
    with a 33-item vector adding a different item
      preserves the original
      adds the item to the vector
    with a 1023-item vector adding a different item
      preserves the original
      adds the item to the vector
    with a 1024-item vector adding a different item
      preserves the original
      adds the item to the vector
    with a 1025-item vector adding a different item
      preserves the original
      adds the item to the vector
    from a subclass
      returns an instance of the subclass
  #<<
    with a empty vector adding a single item
      preserves the original
      adds the item to the vector
    with a single-item vector adding a different item
      preserves the original
      adds the item to the vector
    with a single-item vector adding a duplicate item
      preserves the original
      adds the item to the vector
    with a 31-item vector adding a different item
      preserves the original
      adds the item to the vector
    with a 32-item vector adding a different item
      preserves the original
      adds the item to the vector
    with a 33-item vector adding a different item
      preserves the original
      adds the item to the vector
    with a 1023-item vector adding a different item
      preserves the original
      adds the item to the vector
    with a 1024-item vector adding a different item
      preserves the original
      adds the item to the vector
    with a 1025-item vector adding a different item
      preserves the original
      adds the item to the vector
    from a subclass
      returns an instance of the subclass
  #push
    with a empty vector adding a single item
      preserves the original
      adds the item to the vector
    with a single-item vector adding a different item
      preserves the original
      adds the item to the vector
    with a single-item vector adding a duplicate item
      preserves the original
      adds the item to the vector
    with a 31-item vector adding a different item
      preserves the original
      adds the item to the vector
    with a 32-item vector adding a different item
      preserves the original
      adds the item to the vector
    with a 33-item vector adding a different item
      preserves the original
      adds the item to the vector
    with a 1023-item vector adding a different item
      preserves the original
      adds the item to the vector
    with a 1024-item vector adding a different item
      preserves the original
      adds the item to the vector
    with a 1025-item vector adding a different item
      preserves the original
      adds the item to the vector
    from a subclass
      returns an instance of the subclass

Immutable::Vector
  #any?
    when created with no values
      with a block
        returns false
      with a block
        returns false
    when created with values
      with a block that returns true
        returns true
      with a block that doesn't return true
        returns false
      without a block
        with some values that are truthy
          returns true
        with all values that are falsey
          returns false

Immutable::Vector
  #assoc
    searches for a 2-element array with a given 1st item
    returns nil if a matching 1st item is not found
    uses #== to compare 1st items with provided object
    skips elements which are not indexable
  #rassoc
    searches for a 2-element array with a given 2nd item
    returns nil if a matching 2nd item is not found
    uses #== to compare 2nd items with provided object
    skips elements which are not indexable

Immutable::Vector
  #bsearch
    with a block which returns false for elements below desired position, and true for those at/above
      returns the first element for which the predicate is true
      if the block always returns false
        returns nil
      if the block always returns true
        returns the first element
    with a block which returns a negative number for elements below desired position, zero for the right element, and positive for those above
      returns the element for which the block returns zero
      if the block always returns positive
        returns nil
      if the block always returns negative
        returns nil
      if the block returns sometimes positive, sometimes negative, but never zero
        returns nil
      if not passed a block
        returns an Enumerator
    on an empty vector
      returns nil

Immutable::Vector
  #clear
    on []
      preserves the original
      returns an empty vector
    from a subclass
      returns an instance of the subclass
    on ["A"]
      preserves the original
      returns an empty vector
    from a subclass
      returns an instance of the subclass
    on ["A", "B", "C"]
      preserves the original
      returns an empty vector
    from a subclass
      returns an instance of the subclass

Immutable::Vector
  #combination
    works on many combinations of input
    leaves the original unmodified
    with a block
      returns self
    with no block
      returns an Enumerator
    when passed an argument which is out of bounds
      yields nothing and returns self
    when passed an argument zero
      yields an empty array
    when passed an argument equal to the vector's length
      yields self as an array
    when passed an argument 1
      yields each item in the vector, as single-item vectors
    when passed another integral argument
      yields all combinations of the given length
    on an empty vector
      works the same

Immutable::Vector
  #compact
    returns a new Vector with all nils removed
    doesn't remove false
    on an empty vector
      returns self
    from a subclass
      returns an instance of the subclass

Immutable::Vector
  #<=>
    with [] and [1]
      returns -1
    with [1] and []
      returns 1
    with [] and []
      returns 0
    with [1] and [2]
      returns -1
    with [2] and [1]
      returns 1
    with [1] and [1]
      returns 0
    with [1] and [1, 2]
      returns -1
    with [1, 2] and [1]
      returns 1
    with [1] and [1]
      returns 0
    with [2, 3, 4] and [3, 4, 5]
      returns -1
    with [3, 4, 5] and [2, 3, 4]
      returns 1
    with [2, 3, 4] and [2, 3, 4]
      returns 0
    with [[0]] and [[1]]
      returns -1
    with [[1]] and [[0]]
      returns 1
    with [[0]] and [[0]]
      returns 0

Immutable::Vector
  #+
    preserves the original
    appends the elements in the other enumerable
    on a 1-item vector
      works the same
    on a 31-item vector
      works the same
    on a 32-item vector
      works the same
    on a 33-item vector
      works the same
    on a 1023-item vector
      works the same
    on a 1024-item vector
      works the same
    on a 1025-item vector
      works the same
  #concat
    preserves the original
    appends the elements in the other enumerable
    on a 1-item vector
      works the same
    on a 31-item vector
      works the same
    on a 32-item vector
      works the same
    on a 33-item vector
      works the same
    on a 1023-item vector
      works the same
    on a 1024-item vector
      works the same
    on a 1025-item vector
      works the same

Immutable::Vector
  on []
    returns self
  on ["A"]
    returns self
  on ["A", "B", "C"]
    returns self
  on 1..32
    returns self
  on []
    returns self
  on ["A"]
    returns self
  on ["A", "B", "C"]
    returns self
  on 1..32
    returns self

Immutable::Vector
  #count
    returns the number of elements
    returns the number of elements that equal the argument
    returns the number of element for which the block evaluates to true

Immutable::Vector
  #delete_at
    removes the element at the specified index
    makes no modification if the index is out of range
    works when deleting last item at boundary where vector trie needs to get shallower
    works on an empty vector
    works on a vector with 1 item
    works on a vector with 32 items
    has the right size and contents after many deletions

Immutable::Vector
  #delete
    removes elements that are #== to the argument
    on an empty vector
      returns self
    on a subclass of Vector
      returns an instance of the subclass

Immutable::Vector
  #dig
    returns value at the index with one argument
    returns value at index in nested arrays
    raises an error when indexing deeper than possible
    returns nil if you index past the end of an array
    raises an error when indexing with a key vectors don't understand

Immutable::Vector
  #drop
    raises an ArgumentError if number of elements specified is negative
    10 from []
      preserves the original
      returns []
    10 from ["A"]
      preserves the original
      returns []
    1 from ["A"]
      preserves the original
      returns []
    0 from ["A"]
      preserves the original
      returns ["A"]
    0 from ["A", "B", "C"]
      preserves the original
      returns ["A", "B", "C"]
    2 from ["A", "B", "C"]
      preserves the original
      returns ["C"]
    3 from 1..32
      preserves the original
      returns 4..32
    32 from 1..33
      preserves the original
      returns [33]
    when number of elements specified is zero
      returns self

Immutable::Vector
  #drop_while
    returns an empty vector if block is always true
    stops dropping items if block returns nil
    stops dropping items if block returns false
    on []
      with a block
        preserves the original
        returns []
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        preserves the original
        returns []
      without a block
        returns an Enumerator
    on ["A", "B", "C"]
      with a block
        preserves the original
        returns ["C"]
      without a block
        returns an Enumerator
    on an empty vector
      returns an empty vector

Immutable::Vector
  #each_index
    with a block
      yields all the valid indices into the vector
      returns self
    without a block
      returns an Enumerator
    on an empty vector
      doesn't yield anything
    on a 1-item vector
      yields all valid indices
    on a 2-item vector
      yields all valid indices
    on a 10-item vector
      yields all valid indices
    on a 31-item vector
      yields all valid indices
    on a 32-item vector
      yields all valid indices
    on a 33-item vector
      yields all valid indices
    on a 1000-item vector
      yields all valid indices
    on a 1024-item vector
      yields all valid indices
    on a 1025-item vector
      yields all valid indices

Immutable::Vector
  #each
    with no block
      returns an Enumerator
    on a 31-item vector
      with a block
        returns self
        yields all the items
        iterates over the items in order
    on a 32-item vector
      with a block
        returns self
        yields all the items
        iterates over the items in order
    on a 33-item vector
      with a block
        returns self
        yields all the items
        iterates over the items in order
    on a 1023-item vector
      with a block
        returns self
        yields all the items
        iterates over the items in order
    on a 1024-item vector
      with a block
        returns self
        yields all the items
        iterates over the items in order
    on a 1025-item vector
      with a block
        returns self
        yields all the items
        iterates over the items in order
    on an empty vector
      doesn't yield anything

Immutable::Vector
  #each_with_index
    with no block
      returns an Enumerator
    on a 1-item vector
      with a block
        returns self
        iterates over the items in order
    on a 2-item vector
      with a block
        returns self
        iterates over the items in order
    on a 31-item vector
      with a block
        returns self
        iterates over the items in order
    on a 32-item vector
      with a block
        returns self
        iterates over the items in order
    on a 33-item vector
      with a block
        returns self
        iterates over the items in order
    on a 1023-item vector
      with a block
        returns self
        iterates over the items in order
    on a 1024-item vector
      with a block
        returns self
        iterates over the items in order
    on a 1025-item vector
      with a block
        returns self
        iterates over the items in order
    on an empty vector
      doesn't yield anything

Immutable::Vector
  #empty?
    on []
      returns true
    on ["A"]
      returns false
    on ["A", "B", "C"]
      returns false
  .empty
    returns the canonical empty vector
    from a subclass
      returns an empty instance of the subclass
      calls overridden #initialize when creating empty Hash

Immutable::Vector
  #eql
    returns false when comparing with an array with the same contents
    returns false when comparing with an arbitrary object
    returns false when comparing an empty vector with an empty array
    returns false when comparing with a subclass of Immutable::Vector
  #==
    returns true when comparing with an array with the same contents
    returns false when comparing with an arbitrary object
    returns true when comparing an empty vector with an empty array
    returns true when comparing with a subclass of Immutable::Vector
    works on larger vectors
  #eql?
    returns true
      for vectors [] and []
      for vectors [] and []
    returns false
      for vectors [] and [nil]
      for vectors [nil] and []
    returns false
      for vectors ["A"] and []
      for vectors [] and ["A"]
    returns true
      for vectors ["A"] and ["A"]
      for vectors ["A"] and ["A"]
    returns false
      for vectors ["A"] and ["B"]
      for vectors ["B"] and ["A"]
    returns false
      for vectors ["A", "B"] and ["A"]
      for vectors ["A"] and ["A", "B"]
    returns true
      for vectors ["A", "B", "C"] and ["A", "B", "C"]
      for vectors ["A", "B", "C"] and ["A", "B", "C"]
    returns false
      for vectors ["C", "A", "B"] and ["A", "B", "C"]
      for vectors ["A", "B", "C"] and ["C", "A", "B"]
  #==
    returns true
      for vectors [] and []
      for vectors [] and []
    returns false
      for vectors [] and [nil]
      for vectors [nil] and []
    returns false
      for vectors ["A"] and []
      for vectors [] and ["A"]
    returns true
      for vectors ["A"] and ["A"]
      for vectors ["A"] and ["A"]
    returns false
      for vectors ["A"] and ["B"]
      for vectors ["B"] and ["A"]
    returns false
      for vectors ["A", "B"] and ["A"]
      for vectors ["A"] and ["A", "B"]
    returns true
      for vectors ["A", "B", "C"] and ["A", "B", "C"]
      for vectors ["A", "B", "C"] and ["A", "B", "C"]
    returns false
      for vectors ["C", "A", "B"] and ["A", "B", "C"]
      for vectors ["A", "B", "C"] and ["C", "A", "B"]

Immutable::Vector
  #fetch
    gives precedence to default block over default argument if passed both
    with no default provided
      when the index exists
        returns the value at the index
      when the key does not exist
        raises an IndexError
    with a default value
      when the index exists
        returns the value at the index
      when the index does not exist
        returns the default value
    with a default block
      when the index exists
        returns the value at the index
      when the index does not exist
        invokes the block with the missing index as parameter

Immutable::Vector
  #fill
    can replace a range of items at the beginning of a vector
    can replace a range of items in the middle of a vector
    can replace a range of items at the end of a vector
    can replace all the items in a vector
    can fill past the end of the vector
    behaves like Array#fill, on a variety of inputs
    with 1 argument
      replaces all the items in the vector by default
    with 2 arguments
      replaces up to the end of the vector by default
    when index and length are 0
      leaves the vector unmodified
    when expanding a vector past boundary where vector trie needs to deepen
      works the same
    on a 1000-item vector
      works the same
    on a 1023-item vector
      works the same
    on a 1024-item vector
      works the same
    on a 1025-item vector
      works the same
    on a 2000-item vector
      works the same

Immutable::Vector
  #first
    on []
      returns nil
    on ["A"]
      returns "A"
    on ["A", "B", "C"]
      returns "A"
    on 1..32
      returns 1

Immutable::Vector
  #flat_map
    with an empty vector
      returns the flattened values as an Immutable::Vector
      returns an Immutable::Vector
    with a block that returns an empty vector
      returns the flattened values as an Immutable::Vector
      returns an Immutable::Vector
    with a vector of one item
      returns the flattened values as an Immutable::Vector
      returns an Immutable::Vector
    with a vector of multiple items
      returns the flattened values as an Immutable::Vector
      returns an Immutable::Vector

Immutable::Vector
  #flatten
    recursively flattens nested vectors into containing vector
    flattens nested arrays as well
    leaves the original unmodified
    with an integral argument
      only flattens down to the specified depth
    with an argument of zero
      returns self
    on a subclass
      returns an instance of the subclass
    on a vector with no nested vectors
      returns an unchanged vector
      on a Vector larger than 32 items initialized with Vector.new
        returns an unchanged vector

Immutable::Vector
  #get
    when empty
      always returns nil
    when not empty
      with a positive index
        within the absolute bounds of the vector
          returns the value at the specified index from the head
        outside the absolute bounds of the vector
          returns nil
      with a negative index
        within the absolute bounds of the vector
          returns the value at the specified index from the tail
        outside the absolute bounds of the vector
          returns nil
    on a 1-item vector
      works correctly, even after various addings and removings
    on a 10-item vector
      works correctly, even after various addings and removings
    on a 31-item vector
      works correctly, even after various addings and removings
    on a 32-item vector
      works correctly, even after various addings and removings
    on a 33-item vector
      works correctly, even after various addings and removings
    on a 1024-item vector
      works correctly, even after various addings and removings
    on a 1025-item vector
      works correctly, even after various addings and removings
    on a 2000-item vector
      works correctly, even after various addings and removings
  #at
    when empty
      always returns nil
    when not empty
      with a positive index
        within the absolute bounds of the vector
          returns the value at the specified index from the head
        outside the absolute bounds of the vector
          returns nil
      with a negative index
        within the absolute bounds of the vector
          returns the value at the specified index from the tail
        outside the absolute bounds of the vector
          returns nil
    on a 1-item vector
      works correctly, even after various addings and removings
    on a 10-item vector
      works correctly, even after various addings and removings
    on a 31-item vector
      works correctly, even after various addings and removings
    on a 32-item vector
      works correctly, even after various addings and removings
    on a 33-item vector
      works correctly, even after various addings and removings
    on a 1024-item vector
      works correctly, even after various addings and removings
    on a 1025-item vector
      works correctly, even after various addings and removings
    on a 2000-item vector
      works correctly, even after various addings and removings

Immutable::Vector
  #group_by
    returns a hash without default proc
    with a block
      on []
        returns []
      on [1]
        returns [{true=>Immutable::Vector[1]}]
      on [1, 2, 3, 4]
        returns [{true=>Immutable::Vector[1, 3], false=>Immutable::Vector[2, 4]}]
    without a block
      on []
        returns []
      on [1]
        returns [{1=>Immutable::Vector[1]}]
      on [1, 2, 3, 4]
        returns [{1=>Immutable::Vector[1], 2=>Immutable::Vector[2], 3=>Immutable::Vector[3], 4=>Immutable::Vector[4]}]
    on an empty vector
      returns an empty hash
    from a subclass
      returns an Hash whose values are instances of the subclass

Immutable::Vector
  #include?
    on []
      returns false
    on []
      returns false
    on ["A"]
      returns true
    on ["A"]
      returns false
    on ["A"]
      returns false
    on ["A", "B", nil]
      returns true
    on ["A", "B", nil]
      returns true
    on ["A", "B", nil]
      returns true
    on ["A", "B", nil]
      returns false
    on ["A", "B", false]
      returns true
    on [2]
      returns true
    on [2]
      returns true
    on [2.0]
      returns true
    on [2.0]
      returns true
  #member?
    on []
      returns false
    on []
      returns false
    on ["A"]
      returns true
    on ["A"]
      returns false
    on ["A"]
      returns false
    on ["A", "B", nil]
      returns true
    on ["A", "B", nil]
      returns true
    on ["A", "B", nil]
      returns true
    on ["A", "B", nil]
      returns false
    on ["A", "B", false]
      returns true
    on [2]
      returns true
    on [2]
      returns true
    on [2.0]
      returns true
    on [2.0]
      returns true

Immutable::Vector
  #insert
    can add items at the beginning of a vector
    can add items in the middle of a vector
    can add items at the end of a vector
    can add items past the end of a vector
    accepts a negative index, which counts back from the end of the vector
    raises IndexError if a negative index is too great
    works when adding an item past boundary when vector trie needs to deepen
    works when adding to an empty Vector
    has the right size and contents after many insertions

Immutable::Vector
  #inspect
    with an empty array
      returns its contents as a programmer-readable string
      returns a string which can be eval'd to get back an equivalent vector
    with a single item array
      returns its contents as a programmer-readable string
      returns a string which can be eval'd to get back an equivalent vector
    with a multi-item array
      returns its contents as a programmer-readable string
      returns a string which can be eval'd to get back an equivalent vector
    from a subclass
      returns its contents as a programmer-readable string
      returns a string which can be eval'd to get back an equivalent vector

Immutable::Vector
  #join
    with a separator
      on []
        preserves the original
        returns ""
      on ["A"]
        preserves the original
        returns "A"
      on ["A", "B", "C"]
        preserves the original
        returns "A|B|C"
    without a separator
      on []
        preserves the original
        returns ""
      on ["A"]
        preserves the original
        returns "A"
      on ["A", "B", "C"]
        preserves the original
        returns "ABC"
    without a separator (with global default separator set)
      on ["A", "B", "C"]
        returns "A**B**C"

Immutable::Vector
  #last
    with an empty vector
      returns the last item
    with a single item vector
      returns the last item
    with a multi-item vector
      returns the last item
    with a 31-item vector
      returns the last item
    with a 32-item vector
      returns the last item
    with a 33-item vector
      returns the last item
    with a 1023-item vector
      returns the last item
    with a 1024-item vector
      returns the last item
    with a 1025-item vector
      returns the last item

Immutable::Vector
  #length
    with an empty vector
      returns the values
    with a single item vector
      returns the values
    with a multi-item vector
      returns the values
    with a 31-item vector
      returns the values
    with a 32-item vector
      returns the values
    with a 33-item vector
      returns the values
    with a 1023-item vector
      returns the values
    with a 1024-item vector
      returns the values
    with a 1025-item vector
      returns the values

Immutable::Vector
  #<<
    with a empty array adding a single item
      preserves the original
      ltlts the item to the vector
    with a single-item array adding a different item
      preserves the original
      ltlts the item to the vector
    with a single-item array adding a duplicate item
      preserves the original
      ltlts the item to the vector
    with a 31-item vector adding a different item
      preserves the original
      ltlts the item to the vector
    with a 32-item vector adding a different item
      preserves the original
      ltlts the item to the vector
    with a 33-item vector adding a different item
      preserves the original
      ltlts the item to the vector
    with a 1023-item vector adding a different item
      preserves the original
      ltlts the item to the vector
    with a 1024-item vector adding a different item
      preserves the original
      ltlts the item to the vector
    with a 1025-item vector adding a different item
      preserves the original
      ltlts the item to the vector
    from a subclass
      returns an instance of the subclass

Immutable::Vector
  #map
    when empty
      returns self
    when not empty
      with a block
        preserves the original values
        returns a new vector with the mapped values
      with no block
        returns an Enumerator
    from a subclass
      returns an instance of the subclass
    on a large vector
      works
  #collect
    when empty
      returns self
    when not empty
      with a block
        preserves the original values
        returns a new vector with the mapped values
      with no block
        returns an Enumerator
    from a subclass
      returns an instance of the subclass
    on a large vector
      works

Immutable::Vector
  #marshal_dump/#marshal_load
    can survive dumping and loading into a new process
    is still possible to find items by index after loading

Immutable::Vector
  #max
    with a block
      on []
        returns nil
      on ["A"]
        returns "A"
      on ["Ichi", "Ni", "San"]
        returns "Ichi"
    without a block
      on []
        returns nil
      on ["A"]
        returns "A"
      on ["Ichi", "Ni", "San"]
        returns "San"

Immutable::Vector
  #min
    with a block
      on []
        returns nil
      on ["A"]
        returns "A"
      on ["Ichi", "Ni", "San"]
        returns "Ni"
    without a block
      on []
        returns nil
      on ["A"]
        returns "A"
      on ["Ichi", "Ni", "San"]
        returns "Ichi"

Immutable::Vector
  #*
    raises a TypeError if passed nil
    raises an ArgumentError if passed no arguments
    with a String argument
      acts just like #join
    with an Integer argument
      concatenates n copies of the array
      raises an ArgumentError if integer is negative
      works on large vectors
    with a subclass of Vector
      returns an instance of the subclass

Immutable::Vector
  .new
    accepts a single enumerable argument and creates a new vector
    makes a defensive copy of a non-frozen mutable Array passed in
    is amenable to overriding of #initialize
    from a subclass
      returns a frozen instance of the subclass
  .[]
    accepts a variable number of items and creates a new vector

Immutable::Vector
  #partition
    on []
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [1]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [1, 2]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [1, 2, 3]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [1, 2, 3, 4]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [2, 3, 4]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [3, 4]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [4]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator

Immutable::Vector
  #permutation
    handles duplicate elements correctly
    leaves the original unmodified
    behaves like Array#permutation
    without a block or arguments
      returns an Enumerator of all permutations
    without a block, but with integral argument
      returns an Enumerator of all permutations of given length
    with a block
      returns self
      and no argument
        yields all permutations
      and an integral argument
        yields all permutations of the given length
    on an empty vector
      yields the empty permutation
    with an argument of zero
      yields the empty permutation
    with a length greater than the size of the vector
      yields no permutations

Immutable::Vector
  #pop
    on []
      preserves the original
      returns []
    on ["A"]
      preserves the original
      returns []
    on ["A", "B", "C"]
      preserves the original
      returns ["A", "B"]
    on 1..32
      preserves the original
      returns 1..31
    on 1..33
      preserves the original
      returns 1..32

Immutable::Vector
  #product
    when passed no arguments
      multiplies all items in vector
    when passed one or more vectors
      when passed a block
        yields an array for each combination of items from the vectors
        returns self
      when not passed a block
        returns the cartesian product in an array
      when one of the arguments is empty
        returns an empty array
      when the receiver is empty
        returns an empty array
    when passed one or more Arrays
      also calculates the cartesian product correctly

Immutable::Vector
  #reduce
    on []
      with an initial value of 10
        and a block
          returns 10
    on [1]
      with an initial value of 10
        and a block
          returns 9
    on [1, 2, 3]
      with an initial value of 10
        and a block
          returns 4
    on []
      with no initial value
        and a block
          returns nil
    on [1]
      with no initial value
        and a block
          returns 1
    on [1, 2, 3]
      with no initial value
        and a block
          returns -4
    with no block and a symbol argument
      uses the symbol as the name of a method to reduce with
    with no block and a string argument
      uses the string as the name of a method to reduce with
  #inject
    on []
      with an initial value of 10
        and a block
          returns 10
    on [1]
      with an initial value of 10
        and a block
          returns 9
    on [1, 2, 3]
      with an initial value of 10
        and a block
          returns 4
    on []
      with no initial value
        and a block
          returns nil
    on [1]
      with no initial value
        and a block
          returns 1
    on [1, 2, 3]
      with no initial value
        and a block
          returns -4
    with no block and a symbol argument
      uses the symbol as the name of a method to reduce with
    with no block and a string argument
      uses the string as the name of a method to reduce with

Immutable::Vector
  #reject
    works with a variety of inputs
    on []
      with a block
        returns []
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns ["A"]
      without a block
        returns an Enumerator
    on ["A", "B", "C"]
      with a block
        returns ["A", "B", "C"]
      without a block
        returns an Enumerator
    on ["A", "b", "C"]
      with a block
        returns ["A", "C"]
      without a block
        returns an Enumerator
    on ["a", "b", "c"]
      with a block
        returns []
      without a block
        returns an Enumerator
  #delete_if
    works with a variety of inputs
    on []
      with a block
        returns []
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns ["A"]
      without a block
        returns an Enumerator
    on ["A", "B", "C"]
      with a block
        returns ["A", "B", "C"]
      without a block
        returns an Enumerator
    on ["A", "b", "C"]
      with a block
        returns ["A", "C"]
      without a block
        returns an Enumerator
    on ["a", "b", "c"]
      with a block
        returns []
      without a block
        returns an Enumerator

Immutable::Vector
  #repeated_combination
    leaves the original unmodified
    behaves like Array#repeated_combination
    with no block
      returns an Enumerator
    with a block
      returns self
    with a negative argument
      yields nothing and returns self
    with a zero argument
      yields an empty array
    with a argument of 1
      yields each item in the vector, as single-item vectors
    on an empty vector, with an argument greater than zero
      yields nothing
    with a positive argument, greater than 1
      yields all combinations of the given size (where a single element can appear more than once in a row)

Immutable::Vector
  #repeated_permutation
    handles duplicate elements correctly
    allows permutations larger than the number of elements
    leaves the original unmodified
    behaves like Array#repeated_permutation
    without a block
      and without argument
        returns an Enumerator of all repeated permutations
      with an integral argument
        returns an Enumerator of all repeated permutations of the given length
    with a block
      returns self
      on an empty vector
        yields the empty permutation
      with an argument of zero
        yields the empty permutation
      with no argument
        yields all repeated permutations
      with a positive integral argument
        yields all repeated permutations of the given length

Immutable::Vector
  #reverse_each
    on a 2-item vector
      with a block (internal iteration)
        returns self
        yields all items in the opposite order as #each
      with no block
        returns an Enumerator
    on a 31-item vector
      with a block (internal iteration)
        returns self
        yields all items in the opposite order as #each
      with no block
        returns an Enumerator
    on a 32-item vector
      with a block (internal iteration)
        returns self
        yields all items in the opposite order as #each
      with no block
        returns an Enumerator
    on a 33-item vector
      with a block (internal iteration)
        returns self
        yields all items in the opposite order as #each
      with no block
        returns an Enumerator
    on a 1000-item vector
      with a block (internal iteration)
        returns self
        yields all items in the opposite order as #each
      with no block
        returns an Enumerator
    on a 1024-item vector
      with a block (internal iteration)
        returns self
        yields all items in the opposite order as #each
      with no block
        returns an Enumerator
    on a 1025-item vector
      with a block (internal iteration)
        returns self
        yields all items in the opposite order as #each
      with no block
        returns an Enumerator
    on a 2000-item vector
      with a block (internal iteration)
        returns self
        yields all items in the opposite order as #each
      with no block
        returns an Enumerator

Immutable::Vector
  #reverse
    on []
      returns []
    on [1]
      returns [1]
    on [1, 2]
      returns [2, 1]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32]
      returns [32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33]
      returns [33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]
      returns [100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, 892, 893, 894, 895, 896, 897, 898, 899, 900, 901, 902, 903, 904, 905, 906, 907, 908, 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024]
      returns [1024, 1023, 1022, 1021, 1020, 1019, 1018, 1017, 1016, 1015, 1014, 1013, 1012, 1011, 1010, 1009, 1008, 1007, 1006, 1005, 1004, 1003, 1002, 1001, 1000, 999, 998, 997, 996, 995, 994, 993, 992, 991, 990, 989, 988, 987, 986, 985, 984, 983, 982, 981, 980, 979, 978, 977, 976, 975, 974, 973, 972, 971, 970, 969, 968, 967, 966, 965, 964, 963, 962, 961, 960, 959, 958, 957, 956, 955, 954, 953, 952, 951, 950, 949, 948, 947, 946, 945, 944, 943, 942, 941, 940, 939, 938, 937, 936, 935, 934, 933, 932, 931, 930, 929, 928, 927, 926, 925, 924, 923, 922, 921, 920, 919, 918, 917, 916, 915, 914, 913, 912, 911, 910, 909, 908, 907, 906, 905, 904, 903, 902, 901, 900, 899, 898, 897, 896, 895, 894, 893, 892, 891, 890, 889, 888, 887, 886, 885, 884, 883, 882, 881, 880, 879, 878, 877, 876, 875, 874, 873, 872, 871, 870, 869, 868, 867, 866, 865, 864, 863, 862, 861, 860, 859, 858, 857, 856, 855, 854, 853, 852, 851, 850, 849, 848, 847, 846, 845, 844, 843, 842, 841, 840, 839, 838, 837, 836, 835, 834, 833, 832, 831, 830, 829, 828, 827, 826, 825, 824, 823, 822, 821, 820, 819, 818, 817, 816, 815, 814, 813, 812, 811, 810, 809, 808, 807, 806, 805, 804, 803, 802, 801, 800, 799, 798, 797, 796, 795, 794, 793, 792, 791, 790, 789, 788, 787, 786, 785, 784, 783, 782, 781, 780, 779, 778, 777, 776, 775, 774, 773, 772, 771, 770, 769, 768, 767, 766, 765, 764, 763, 762, 761, 760, 759, 758, 757, 756, 755, 754, 753, 752, 751, 750, 749, 748, 747, 746, 745, 744, 743, 742, 741, 740, 739, 738, 737, 736, 735, 734, 733, 732, 731, 730, 729, 728, 727, 726, 725, 724, 723, 722, 721, 720, 719, 718, 717, 716, 715, 714, 713, 712, 711, 710, 709, 708, 707, 706, 705, 704, 703, 702, 701, 700, 699, 698, 697, 696, 695, 694, 693, 692, 691, 690, 689, 688, 687, 686, 685, 684, 683, 682, 681, 680, 679, 678, 677, 676, 675, 674, 673, 672, 671, 670, 669, 668, 667, 666, 665, 664, 663, 662, 661, 660, 659, 658, 657, 656, 655, 654, 653, 652, 651, 650, 649, 648, 647, 646, 645, 644, 643, 642, 641, 640, 639, 638, 637, 636, 635, 634, 633, 632, 631, 630, 629, 628, 627, 626, 625, 624, 623, 622, 621, 620, 619, 618, 617, 616, 615, 614, 613, 612, 611, 610, 609, 608, 607, 606, 605, 604, 603, 602, 601, 600, 599, 598, 597, 596, 595, 594, 593, 592, 591, 590, 589, 588, 587, 586, 585, 584, 583, 582, 581, 580, 579, 578, 577, 576, 575, 574, 573, 572, 571, 570, 569, 568, 567, 566, 565, 564, 563, 562, 561, 560, 559, 558, 557, 556, 555, 554, 553, 552, 551, 550, 549, 548, 547, 546, 545, 544, 543, 542, 541, 540, 539, 538, 537, 536, 535, 534, 533, 532, 531, 530, 529, 528, 527, 526, 525, 524, 523, 522, 521, 520, 519, 518, 517, 516, 515, 514, 513, 512, 511, 510, 509, 508, 507, 506, 505, 504, 503, 502, 501, 500, 499, 498, 497, 496, 495, 494, 493, 492, 491, 490, 489, 488, 487, 486, 485, 484, 483, 482, 481, 480, 479, 478, 477, 476, 475, 474, 473, 472, 471, 470, 469, 468, 467, 466, 465, 464, 463, 462, 461, 460, 459, 458, 457, 456, 455, 454, 453, 452, 451, 450, 449, 448, 447, 446, 445, 444, 443, 442, 441, 440, 439, 438, 437, 436, 435, 434, 433, 432, 431, 430, 429, 428, 427, 426, 425, 424, 423, 422, 421, 420, 419, 418, 417, 416, 415, 414, 413, 412, 411, 410, 409, 408, 407, 406, 405, 404, 403, 402, 401, 400, 399, 398, 397, 396, 395, 394, 393, 392, 391, 390, 389, 388, 387, 386, 385, 384, 383, 382, 381, 380, 379, 378, 377, 376, 375, 374, 373, 372, 371, 370, 369, 368, 367, 366, 365, 364, 363, 362, 361, 360, 359, 358, 357, 356, 355, 354, 353, 352, 351, 350, 349, 348, 347, 346, 345, 344, 343, 342, 341, 340, 339, 338, 337, 336, 335, 334, 333, 332, 331, 330, 329, 328, 327, 326, 325, 324, 323, 322, 321, 320, 319, 318, 317, 316, 315, 314, 313, 312, 311, 310, 309, 308, 307, 306, 305, 304, 303, 302, 301, 300, 299, 298, 297, 296, 295, 294, 293, 292, 291, 290, 289, 288, 287, 286, 285, 284, 283, 282, 281, 280, 279, 278, 277, 276, 275, 274, 273, 272, 271, 270, 269, 268, 267, 266, 265, 264, 263, 262, 261, 260, 259, 258, 257, 256, 255, 254, 253, 252, 251, 250, 249, 248, 247, 246, 245, 244, 243, 242, 241, 240, 239, 238, 237, 236, 235, 234, 233, 232, 231, 230, 229, 228, 227, 226, 225, 224, 223, 222, 221, 220, 219, 218, 217, 216, 215, 214, 213, 212, 211, 210, 209, 208, 207, 206, 205, 204, 203, 202, 201, 200, 199, 198, 197, 196, 195, 194, 193, 192, 191, 190, 189, 188, 187, 186, 185, 184, 183, 182, 181, 180, 179, 178, 177, 176, 175, 174, 173, 172, 171, 170, 169, 168, 167, 166, 165, 164, 163, 162, 161, 160, 159, 158, 157, 156, 155, 154, 153, 152, 151, 150, 149, 148, 147, 146, 145, 144, 143, 142, 141, 140, 139, 138, 137, 136, 135, 134, 133, 132, 131, 130, 129, 128, 127, 126, 125, 124, 123, 122, 121, 120, 119, 118, 117, 116, 115, 114, 113, 112, 111, 110, 109, 108, 107, 106, 105, 104, 103, 102, 101, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

Immutable::Vector
  #rindex
    when passed an object present in the vector
      returns the last index where the object is present
    when passed an object not present in the vector
      returns nil
    with a block
      returns the last index of an object which the predicate is true for
    without an argument OR block
      returns an Enumerator

Immutable::Vector
  #rotate
    leaves the original unmodified
    when passed no argument
      returns a new vector with the first element moved to the end
    with an integral argument n
      returns a new vector with the first (n % size) elements moved to the end
    with a floating-point argument n
      coerces the argument to integer using to_int
    with a non-numeric argument
      raises a TypeError
    with an argument of zero
      returns self
    with an argument equal to the vector's size
      returns self
    on a 31-item vector
      behaves like Array#rotate
    on a 32-item vector
      behaves like Array#rotate
    on a 33-item vector
      behaves like Array#rotate
    on a 1000-item vector
      behaves like Array#rotate
    on a 1023-item vector
      behaves like Array#rotate
    on a 1024-item vector
      behaves like Array#rotate
    on a 1025-item vector
      behaves like Array#rotate
    from a subclass
      returns an instance of the subclass

Immutable::Vector
  #sample
    returns a randomly chosen item

Immutable::Vector
  #select
    works with a variety of inputs
    with a block
      preserves the original
      returns a vector with the matching values
    with no block
      returns an Enumerator
    when nothing matches
      preserves the original
      returns an empty vector
    on an empty vector
      returns self
    from a subclass
      returns an instance of the subclass
  #find_all
    works with a variety of inputs
    with a block
      preserves the original
      returns a vector with the matching values
    with no block
      returns an Enumerator
    when nothing matches
      preserves the original
      returns an empty vector
    on an empty vector
      returns self
    from a subclass
      returns an instance of the subclass

Immutable::Vector
  #set
    when empty
WARNING: Using the `raise_error` matcher without providing a specific error or message risks false positives, since `raise_error` will match when Ruby raises a `NoMethodError`, `NameError` or `ArgumentError`, potentially allowing the expectation to pass without even executing the method you are intending to call. Actual error raised was #<IndexError: index -1 outside of vector bounds>. Instead consider providing a specific error class or message. This message can be suppressed by setting: `RSpec::Expectations.configuration.on_potential_false_positives = :nothing`. Called from /build/reproducible-path/ruby-immutable-ruby-0.1.0/spec/lib/immutable/vector/set_spec.rb:11:in `block (4 levels) in <top (required)>'.
      raises an error for index -1
      allows indexes 0 and 1 to be set
    when not empty
      with a block
        and a positive index
          within the absolute bounds of the vector
            passes the current value to the block
            replaces the value with the result of the block
            supports to_proc methods
          just past the end of the vector
            passes nil to the block and adds a new value
          further outside the bounds of the vector
            passes nil to the block, fills up missing nils, and adds a new value
        and a negative index
          within the absolute bounds of the vector
            passes the current value to the block
            replaces the value with the result of the block
            supports to_proc methods
          outside the absolute bounds of the vector
WARNING: Using the `raise_error` matcher without providing a specific error or message risks false positives, since `raise_error` will match when Ruby raises a `NoMethodError`, `NameError` or `ArgumentError`, potentially allowing the expectation to pass without even executing the method you are intending to call. Actual error raised was #<IndexError: index -4 outside of vector bounds>. Instead consider providing a specific error class or message. This message can be suppressed by setting: `RSpec::Expectations.configuration.on_potential_false_positives = :nothing`. Called from /build/reproducible-path/ruby-immutable-ruby-0.1.0/spec/lib/immutable/vector/set_spec.rb:75:in `block (7 levels) in <top (required)>'.
            raises an error
      with a value
        and a positive index
          within the absolute bounds of the vector
            preserves the original
            sets the new value at the specified index
          just past the end of the vector
            adds a new value
          outside the absolute bounds of the vector
            fills up with nils
        with a negative index
          preserves the original
          sets the new value at the specified index
        outside the absolute bounds of the vector
WARNING: Using the `raise_error` matcher without providing a specific error or message risks false positives, since `raise_error` will match when Ruby raises a `NoMethodError`, `NameError` or `ArgumentError`, potentially allowing the expectation to pass without even executing the method you are intending to call. Actual error raised was #<IndexError: index -4 outside of vector bounds>. Instead consider providing a specific error class or message. This message can be suppressed by setting: `RSpec::Expectations.configuration.on_potential_false_positives = :nothing`. Called from /build/reproducible-path/ruby-immutable-ruby-0.1.0/spec/lib/immutable/vector/set_spec.rb:125:in `block (6 levels) in <top (required)>'.
          raises an error
    from a subclass
      returns an instance of the subclass
    on a 10-item vector
      works correctly
    on a 31-item vector
      works correctly
    on a 32-item vector
      works correctly
    on a 33-item vector
      works correctly
    on a 1000-item vector
      works correctly
    on a 1023-item vector
      works correctly
    on a 1024-item vector
      works correctly
    on a 1025-item vector
      works correctly
    on a 2000-item vector
      works correctly
    with an identical value to an existing item
      on a 1-item vector
        returns self
      on a 2-item vector
        returns self
      on a 5-item vector
        returns self
      on a 31-item vector
        returns self
      on a 32-item vector
        returns self
      on a 33-item vector
        returns self
      on a 100-item vector
        returns self
      on a 200-item vector
        returns self

Immutable::Vector
  #shift
    on []
      preserves the original
      returns []
    on ["A"]
      preserves the original
      returns []
    on ["A", "B", "C"]
      preserves the original
      returns ["B", "C"]
    on 1..31
      preserves the original
      returns 2..31
    on 1..32
      preserves the original
      returns 2..32
    on 1..33
      preserves the original
      returns 2..33

Immutable::Vector
  #shuffle
    returns the same values, in a usually different order
    leaves the original unchanged
    from a subclass
      returns an instance of the subclass
    on a 32-item vector
      works correctly
    on a 33-item vector
      works correctly
    on a 1023-item vector
      works correctly
    on a 1024-item vector
      works correctly
    on a 1025-item vector
      works correctly

Immutable::Vector
  #slice
    when passed a positive integral index
      returns the element at that index
      leaves the original unchanged
    when passed a negative integral index
      returns the element which is number (index.abs) counting from the end of the vector
    when passed a positive integral index and count
      returns 'count' elements starting from 'index'
      leaves the original unchanged
    when passed a negative integral index and count
      returns 'count' elements, starting from index which is number 'index.abs' counting from the end of the array
    when passed a Range
      returns the elements whose indexes are within the given Range
      leaves the original unchanged
  when passed a subclass of Range
    works the same as with a Range
  on a subclass of Vector
    with index and count or a range, returns an instance of the subclass
  #[]
    when passed a positive integral index
      returns the element at that index
      leaves the original unchanged
    when passed a negative integral index
      returns the element which is number (index.abs) counting from the end of the vector
    when passed a positive integral index and count
      returns 'count' elements starting from 'index'
      leaves the original unchanged
    when passed a negative integral index and count
      returns 'count' elements, starting from index which is number 'index.abs' counting from the end of the array
    when passed a Range
      returns the elements whose indexes are within the given Range
      leaves the original unchanged
  when passed a subclass of Range
    works the same as with a Range
  on a subclass of Vector
    with index and count or a range, returns an instance of the subclass

Immutable::Vector
  #sort
    on []
      with a block
        preserves the original
        returns []
      without a block
        preserves the original
        returns []
    on ["A"]
      with a block
        preserves the original
        returns ["A"]
      without a block
        preserves the original
        returns ["A"]
    on ["Ichi", "Ni", "San"]
      with a block
        preserves the original
        returns ["Ni", "San", "Ichi"]
      without a block
        preserves the original
        returns ["Ichi", "Ni", "San"]
    on a 10-item vector
      behaves like Arraysort
    on a 31-item vector
      behaves like Arraysort
    on a 32-item vector
      behaves like Arraysort
    on a 33-item vector
      behaves like Arraysort
    on a 1023-item vector
      behaves like Arraysort
    on a 1024-item vector
      behaves like Arraysort
    on a 1025-item vector
      behaves like Arraysort
  #sort_by
    on []
      with a block
        preserves the original
        returns []
      without a block
        preserves the original
        returns []
    on ["A"]
      with a block
        preserves the original
        returns ["A"]
      without a block
        preserves the original
        returns ["A"]
    on ["Ichi", "Ni", "San"]
      with a block
        preserves the original
        returns ["Ni", "San", "Ichi"]
      without a block
        preserves the original
        returns ["Ichi", "Ni", "San"]
    on a 10-item vector
      behaves like Arraysort_by
    on a 31-item vector
      behaves like Arraysort_by
    on a 32-item vector
      behaves like Arraysort_by
    on a 33-item vector
      behaves like Arraysort_by
    on a 1023-item vector
      behaves like Arraysort_by
    on a 1024-item vector
      behaves like Arraysort_by
    on a 1025-item vector
      behaves like Arraysort_by

Immutable::Vector
  #sum
    on []
      returns 0
    on [2]
      returns 2
    on [1, 3, 5, 7, 11]
      returns 27

Immutable::Vector
  #take
    10 from []
      preserves the original
      returns []
    10 from ["A"]
      preserves the original
      returns ["A"]
    0 from ["A", "B", "C"]
      preserves the original
      returns []
    2 from ["A", "B", "C"]
      preserves the original
      returns ["A", "B"]
    1 from 1..32
      preserves the original
      returns [1]
    32 from 1..33
      preserves the original
      returns 1..32
    40 from 1..100
      preserves the original
      returns 1..40
    when number of elements specified is identical to size
      returns self
    when number of elements specified is bigger than size
      returns self

Immutable::Vector
  #take_while
    on []
      with a block
        returns []
        preserves the original
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns ["A"]
        preserves the original
      without a block
        returns an Enumerator
    on ["A", "B", "C"]
      with a block
        returns ["A", "B"]
        preserves the original
      without a block
        returns an Enumerator

Immutable::Vector
  #to_a
    with an empty vector
      returns the values
    with an single item vector
      returns the values
    with an multi-item vector
      returns the values
    with a 10-item vector
      returns the values
    with a 31-item vector
      returns the values
    with a 32-item vector
      returns the values
    with a 33-item vector
      returns the values
    with a 1000-item vector
      returns the values
    with a 1023-item vector
      returns the values
    with a 1024-item vector
      returns the values
    with a 1025-item vector
      returns the values

Immutable::Vector
  #to_ary
    converts using block parameters
    converts using method arguments
    converts using splat

Immutable::Vector
  #to_list
    on []
      returns a list
      the returned list
        has the correct length
        contains all values
    on ["A"]
      returns a list
      the returned list
        has the correct length
        contains all values
    on ["A", "B", "C"]
      returns a list
      the returned list
        has the correct length
        contains all values

Immutable::Vector
  #to_set
    on []
      returns a set with the same values
    on ["A"]
      returns a set with the same values
    on ["A", "B", "C"]
      returns a set with the same values
    on 1..10
      returns a set with the same values
    on 1..32
      returns a set with the same values
    on 1..33
      returns a set with the same values
    on 1..1000
      returns a set with the same values

Immutable::Vector
  #transpose
    takes a vector of vectors and transposes rows and columns
    raises an IndexError if the vectors are not of the same length
    also works on Vectors of Arrays
    on 10-item vectors
      behaves like Array#transpose
    on 31-item vectors
      behaves like Array#transpose
    on 32-item vectors
      behaves like Array#transpose
    on 33-item vectors
      behaves like Array#transpose
    on 1000-item vectors
      behaves like Array#transpose
    on 1023-item vectors
      behaves like Array#transpose
    on 1024-item vectors
      behaves like Array#transpose
    on 1025-item vectors
      behaves like Array#transpose
    on 2000-item vectors
      behaves like Array#transpose
    on a subclass of Vector
      returns instances of the subclass
    if an item does not respond to #size and #[]
      raises TypeError

Immutable::Vector
  #uniq
    returns a vector with no duplicates
    leaves the original unmodified
    uses #eql? semantics
    also uses #hash when determining which values are duplicates
    keeps the first of each group of duplicate values
    when passed a block
      uses the return value of the block to determine which items are duplicate
    on a vector with no duplicates
      returns an unchanged vector
      if the vector has more than 32 elements and is initialized with Vector.new
        returns an unchanged vector
    on a 10-item vector
      behaves like Array#uniq
    on a 31-item vector
      behaves like Array#uniq
    on a 32-item vector
      behaves like Array#uniq
    on a 33-item vector
      behaves like Array#uniq
    on a 1000-item vector
      behaves like Array#uniq
    on a 1023-item vector
      behaves like Array#uniq
    on a 1024-item vector
      behaves like Array#uniq
    on a 1025-item vector
      behaves like Array#uniq
    on a 2000-item vector
      behaves like Array#uniq
    from a subclass
      returns an instance of the subclass

Immutable::Vector
  #unshift
    on [] with "A"
      preserves the original
      returns ["A"]
    on ["A"] with "B"
      preserves the original
      returns ["B", "A"]
    on ["A"] with "A"
      preserves the original
      returns ["A", "A"]
    on ["A", "B", "C"] with "D"
      preserves the original
      returns ["D", "A", "B", "C"]
    on 1..31 with 0
      preserves the original
      returns 0..31
    on 1..32 with 0
      preserves the original
      returns 0..32
    on 1..33 with 0
      preserves the original
      returns 0..33

Immutable::Vector
  #update_in
    with one level on existing key
      passes the value to the block
      replaces the value with the result of the block
      should preserve the original
    with multi-level vectors on existing keys
      passes the value to the block
      replaces the value with the result of the block
      should preserve the original
    with multi-level creating sub-hashes when keys don't exist
      passes nil to the block
      creates subhashes on the way to set the value
    with multi-level including hash with existing keys
      passes the value to the block
      replaces the value with the result of the block
      should preserve the original
    with empty key_path
      raises ArguemntError

Immutable::Vector
  #values_at
    accepts any number of indices, and returns a vector of items at those indices
    when passed invalid indices
      fills in with nils
    when passed no arguments
      returns an empty vector
    from a subclass
      returns an instance of the subclass

Immutable::Vector
  #zip
    with a block
      yields arrays of one corresponding element from each input sequence
      fills in the missing values with nils
      returns nil
      can handle multiple inputs, of different classes
    without a block
      returns a vector of arrays (one corresponding element from each input sequence)
    on 10-item vectors
      behaves like Array#zip
    on 31-item vectors
      behaves like Array#zip
    on 32-item vectors
      behaves like Array#zip
    on 33-item vectors
      behaves like Array#zip
    on 1000-item vectors
      behaves like Array#zip
    on 1023-item vectors
      behaves like Array#zip
    on 1024-item vectors
      behaves like Array#zip
    on 1025-item vectors
      behaves like Array#zip
    from a subclass
      returns an instance of the subclass

Immutable
  Hash
    can be loaded separately
  Set
    can be loaded separately
  Vector
    can be loaded separately
  List
    can be loaded separately
  SortedSet
    can be loaded separately
  Deque
    can be loaded separately

Top 10 slowest examples (6.28 seconds, 30.7% of total time):
  Immutable::List#each_chunk on a really big list doesn't run out of stack
    1.11 seconds ./spec/lib/immutable/list/each_slice_spec.rb:7
  Immutable::List#each_slice on a really big list doesn't run out of stack
    1.04 seconds ./spec/lib/immutable/list/each_slice_spec.rb:7
  Immutable::List ensures each node of a lazy list will only be realized on ONE thread, even when accessed by multiple threads
    0.80773 seconds ./spec/lib/immutable/list/multithreading_spec.rb:5
  Immutable::List#all? on a really big list doesn't run out of stack
    0.52851 seconds ./spec/lib/immutable/list/all_spec.rb:8
  Immutable::List#partition calls the passed block only once for each item, even with multiple threads
    0.52143 seconds ./spec/lib/immutable/list/partition_spec.rb:38
  Immutable::Set#select works on a large set, with many combinations of input
    0.51406 seconds ./spec/lib/immutable/set/select_spec.rb:59
  Immutable::Set#find_all works on a large set, with many combinations of input
    0.48361 seconds ./spec/lib/immutable/set/select_spec.rb:59
  Immutable::List#eql? on a really big list doesn't run out of stack
    0.46305 seconds ./spec/lib/immutable/list/eql_spec.rb:6
  Immutable::Hash#select works on a large hash, with many combinations of input
    0.40847 seconds ./spec/lib/immutable/hash/select_spec.rb:43
  Immutable::Hash#find_all works on a large hash, with many combinations of input
    0.40064 seconds ./spec/lib/immutable/hash/select_spec.rb:43

Top 10 slowest example groups:
  Immutable::Hash
    0.32329 seconds average (0.64658 seconds / 2 examples) ./spec/lib/immutable/hash/marshal_spec.rb:3
  Immutable::Deque
    0.31496 seconds average (0.62993 seconds / 2 examples) ./spec/lib/immutable/deque/marshal_spec.rb:3
  Immutable::Set
    0.31431 seconds average (0.62862 seconds / 2 examples) ./spec/lib/immutable/set/marshal_spec.rb:3
  Immutable::List
    0.31292 seconds average (0.93877 seconds / 3 examples) ./spec/lib/immutable/list/multithreading_spec.rb:4
  Immutable::Vector
    0.30681 seconds average (0.61361 seconds / 2 examples) ./spec/lib/immutable/vector/marshal_spec.rb:3
  Immutable::SortedSet
    0.22416 seconds average (0.67247 seconds / 3 examples) ./spec/lib/immutable/sorted_set/marshal_spec.rb:3
  Immutable
    0.20518 seconds average (1.23 seconds / 6 examples) ./spec/lib/load_spec.rb:6
  Immutable::Hash
    0.0998 seconds average (0.99803 seconds / 10 examples) ./spec/lib/immutable/hash/size_spec.rb:3
  Immutable::List
    0.09287 seconds average (0.27861 seconds / 3 examples) ./spec/lib/immutable/list/hash_spec.rb:3
  Immutable::List
    0.0687 seconds average (0.54961 seconds / 8 examples) ./spec/lib/immutable/list/all_spec.rb:3

Finished in 20.47 seconds (files took 2.78 seconds to load)
4608 examples, 0 failures

/usr/bin/ruby3.3 /usr/bin/gem2deb-test-runner

┌──────────────────────────────────────────────────────────────────────────────┐
│ Checking Rubygems dependency resolution on ruby3.3                           │
└──────────────────────────────────────────────────────────────────────────────┘

RUBYLIB=. GEM_PATH=/build/reproducible-path/ruby-immutable-ruby-0.1.0/debian/ruby-immutable-ruby/usr/share/rubygems-integration/all:/build/reproducible-path/ruby-immutable-ruby-0.1.0/debian/.debhelper/generated/_source/home/.local/share/gem/ruby/3.3.0:/var/lib/gems/3.3.0:/usr/local/lib/ruby/gems/3.3.0:/usr/lib/ruby/gems/3.3.0:/usr/lib/i386-linux-gnu/ruby/gems/3.3.0:/usr/share/rubygems-integration/3.3.0:/usr/share/rubygems-integration/all:/usr/lib/i386-linux-gnu/rubygems-integration/3.3.0 ruby3.3 -e gem\ \"immutable-ruby\"

┌──────────────────────────────────────────────────────────────────────────────┐
│ Run tests for ruby3.3 from debian/ruby-tests.rake                            │
└──────────────────────────────────────────────────────────────────────────────┘

RUBYLIB=. GEM_PATH=/build/reproducible-path/ruby-immutable-ruby-0.1.0/debian/ruby-immutable-ruby/usr/share/rubygems-integration/all:/build/reproducible-path/ruby-immutable-ruby-0.1.0/debian/.debhelper/generated/_source/home/.local/share/gem/ruby/3.3.0:/var/lib/gems/3.3.0:/usr/local/lib/ruby/gems/3.3.0:/usr/lib/ruby/gems/3.3.0:/usr/lib/i386-linux-gnu/ruby/gems/3.3.0:/usr/share/rubygems-integration/3.3.0:/usr/share/rubygems-integration/all:/usr/lib/i386-linux-gnu/rubygems-integration/3.3.0 ruby3.3 -S rake --rakelibdir /gem2deb-nonexistent -f debian/ruby-tests.rake
/usr/bin/ruby3.3 -I/usr/share/rubygems-integration/all/gems/rspec-support-3.13.1/lib:/usr/share/rubygems-integration/all/gems/rspec-core-3.13.0/lib /usr/share/rubygems-integration/all/gems/rspec-core-3.13.0/exe/rspec --pattern ./spec/\*\*/\*_spec.rb --format documentation

Array
  #to_list
    returns an equivalent Immutable list

Enumerable
  #to_list
    returns an equivalent list
    works on Ranges

IO
  #to_list
    with a File
      returns an equivalent list
    with a StringIO
      returns an equivalent list

Immutable::Deque
  #clear
    on []
      preserves the original
      returns an empty deque
    on ["A"]
      preserves the original
      returns an empty deque
    on ["A", "B", "C"]
      preserves the original
      returns an empty deque
  from a subclass
    returns an instance of the subclass

Immutable::Deque
  .[]
    with no arguments
      always returns the same instance
      returns an empty, frozen deque
    with a number of items
      always returns a different instance
      is the same as repeatedly using #endeque

Immutable::Deque
  on []
    returns self
  on ["A"]
    returns self
  on ["A", "B", "C"]
    returns self
  on []
    returns self
  on ["A"]
    returns self
  on ["A", "B", "C"]
    returns self

Immutable::Deque
  #dequeue
    on []
      preserves the original
      returns []
    on ["A"]
      preserves the original
      returns []
    on ["A", "B", "C"]
      preserves the original
      returns ["B", "C"]
  on empty subclass
    returns empty object of same class
  #shift
    on []
      preserves the original
      returns []
    on ["A"]
      preserves the original
      returns []
    on ["A", "B", "C"]
      preserves the original
      returns ["B", "C"]
  on empty subclass
    returns empty object of same class

Immutable::Deque
  #empty?
    on []
      returns true
    on ["A"]
      returns false
    on ["A", "B", "C"]
      returns false
    after dedequeing an item from ["A", "B", "C"]
      returns false
  .empty
    returns the canonical empty deque
    from a subclass
      returns an empty instance of the subclass

Immutable::Deque
  #enqueue
    on [] with "A"
      preserves the original
      returns ["A"]
    on ["A"] with "B"
      preserves the original
      returns ["A", "B"]
    on ["A"] with "A"
      preserves the original
      returns ["A", "A"]
    on ["A", "B", "C"] with "D"
      preserves the original
      returns ["A", "B", "C", "D"]
  #push
    on [] with "A"
      preserves the original
      returns ["A"]
    on ["A"] with "B"
      preserves the original
      returns ["A", "B"]
    on ["A"] with "A"
      preserves the original
      returns ["A", "A"]
    on ["A", "B", "C"] with "D"
      preserves the original
      returns ["A", "B", "C", "D"]

Immutable::Deque
  #first
    on []
      returns nil
    on ["A"]
      returns "A"
    on ["A", "B", "C"]
      returns "A"

Immutable::Deque
  #inspect
    on []
      returns "Immutable::Deque[]"
      returns a string which can be eval'd to get an equivalent object
    on ["A"]
      returns "Immutable::Deque[\"A\"]"
      returns a string which can be eval'd to get an equivalent object
    on ["A", "B", "C"]
      returns "Immutable::Deque[\"A\", \"B\", \"C\"]"
      returns a string which can be eval'd to get an equivalent object

Immutable::Deque
  #last
    on []
      returns nil
    on ["A"]
      returns "A"
    on ["A", "B", "C"]
      returns "C"

Immutable::Deque
  #marshal_dump/#marshal_load
    can survive dumping and loading into a new process
    is still possible to push and pop items after loading

Immutable::Deque
  .new
    accepts a single enumerable argument and creates a new deque
    is amenable to overriding of #initialize
    from a subclass
      returns a frozen instance of the subclass
  .[]
    accepts a variable number of items and creates a new deque

Immutable::Deque
  #pop
    on []
      preserves the original
      returns []
      returns a frozen instance
    on ["A"]
      preserves the original
      returns []
      returns a frozen instance
    on ["A", "B", "C"]
      preserves the original
      returns ["A", "B"]
      returns a frozen instance
    on empty subclass
      returns an empty object of the same class

Immutable::Deque
  #pretty_print
    prints the whole Deque on one line if it fits
    prints each item on its own line, if not

Immutable::Deque
  #push
    pushing "A" into []
      preserves the original
      returns ["A"]
      returns a frozen instance
    pushing "B" into ["A"]
      preserves the original
      returns ["A", "B"]
      returns a frozen instance
    pushing "D" into ["A", "B", "C"]
      preserves the original
      returns ["A", "B", "C", "D"]
      returns a frozen instance
    on a subclass
      returns an object of same class

Immutable::Deque
  modification (using #push, #pop, #shift, and #unshift)
    works when applied in many random combinations

Immutable::Deque
  #rotate
    on []
      preserves the original
      returns []
      returns a frozen instance
    on ["A"]
      preserves the original
      returns ["A"]
      returns a frozen instance
    on ["A", "B", "C"]
      preserves the original
      returns ["B", "C", "A"]
      returns a frozen instance
    on ["A", "B", "C", "D"]
      preserves the original
      returns ["A", "B", "C", "D"]
      returns a frozen instance
    on ["A", "B", "C", "D"]
      preserves the original
      returns ["C", "D", "A", "B"]
      returns a frozen instance
    on a Deque with most items on 'front' list
      works with a small rotation
      works with a larger rotation
    on a Deque with most items on 'rear' list
      works with a small rotation
      works with a larger rotation
    on empty subclass
      returns an empty object of the same class

Immutable::Deque
  #shift
    on []
      preserves the original
      returns []
      returns a frozen instance
    on ["A"]
      preserves the original
      returns []
      returns a frozen instance
    on ["A", "B", "C"]
      preserves the original
      returns ["B", "C"]
      returns a frozen instance

Immutable::Deque
  #size
    on []
      returns 0
    on ["A"]
      returns 1
    on ["A", "B", "C"]
      returns 3
  #length
    on []
      returns 0
    on ["A"]
      returns 1
    on ["A", "B", "C"]
      returns 3

Immutable::Deque
  #to_a
    on []
      returns []
      returns a mutable array
    on ["A"]
      returns ["A"]
      returns a mutable array
    on ["A", "B", "C"]
      returns ["A", "B", "C"]
      returns a mutable array
  #entries
    on []
      returns []
      returns a mutable array
    on ["A"]
      returns ["A"]
      returns a mutable array
    on ["A", "B", "C"]
      returns ["A", "B", "C"]
      returns a mutable array

Immutable::Deque
  #to_ary
    enables implicit conversion to
      block parameters
      method arguments
      works with splat

Immutable::Deque
  #to_list
    on []
      returns a list containing []
    on ["A"]
      returns a list containing ["A"]
    on ["A", "B", "C"]
      returns a list containing ["A", "B", "C"]
    after dedequeing an item from ["A", "B", "C"]
      returns a list containing ["B", "C"]

Immutable::Deque
  #unshift
    on [] with "A"
      preserves the original
      returns ["A"]
      returns a frozen instance
    on ["A"] with "B"
      preserves the original
      returns ["B", "A"]
      returns a frozen instance
    on ["A"] with "A"
      preserves the original
      returns ["A", "A"]
      returns a frozen instance
    on ["A", "B", "C"] with "D"
      preserves the original
      returns ["D", "A", "B", "C"]
      returns a frozen instance

Immutable::Hash
  #all?
    when empty
      without a block
        returns true
      with a block
        returns true
    when not empty
      without a block
        returns true
      with a block
        returns true if the block always returns true
        returns false if the block ever returns false
        propagates an exception from the block
        stops iterating as soon as the block returns false

Immutable::Hash
  #any?
    when empty
      with a block returns false
      with no block returns false
    when not empty
      with a block
        returns true if the block ever returns true (["A", "aye"])
        returns false if the block always returns false
        returns true if the block ever returns true (["B", "bee"])
        returns false if the block always returns false
        returns true if the block ever returns true (["C", "see"])
        returns false if the block always returns false
        returns true if the block ever returns true ([nil, "NIL"])
        returns false if the block always returns false
        propagates exceptions raised in the block
        stops iterating as soon as the block returns true
      with no block
        returns true

Immutable::Hash
  #assoc
    searches for a key/val pair with a given key
    returns nil if a matching key is not found
    returns nil even if there is a default
    uses #== to compare keys with provided object
  #rassoc
    searches for a key/val pair with a given value
    returns nil if a matching value is not found
    returns nil even if there is a default
    uses #== to compare values with provided object

Immutable::Hash
  #clear
    maintains the default Proc, if there is one
    on []
      preserves the original
      returns an empty hash
    on [{"A"=>"aye"}]
      preserves the original
      returns an empty hash
    on [{"A"=>"aye", "B"=>"bee", "C"=>"see"}]
      preserves the original
      returns an empty hash
    on a subclass
      returns an empty instance of the subclass

Immutable::Hash
  .hash
    with nothing
      returns the canonical empty hash
    with an implicit hash
      is equivalent to repeatedly using #put
    with an array of pairs
      initializes a new Hash
    with an Immutable::Hash
      initializes an equivalent Hash

Immutable::Hash
  #dup
    returns self
  #clone
    returns self

Immutable::Hash
  #default_proc
    returns the default block given when the Hash was created
    returns nil if no default block was given
    after a key/val pair are inserted
      doesn't change
    after all key/val pairs are filtered out
      doesn't change
    after Hash is inverted
      doesn't change
    when a slice is taken
      doesn't change
    when keys are removed with #except
      doesn't change
    when Hash is mapped
      doesn't change
    when another Hash is merged in
      doesn't change

Immutable::Hash
  #delete
    with an existing key
      preserves the original
      returns a copy with the remaining key/value pairs
    with a non-existing key
      preserves the original values
      returns self
    when removing the last key
      from a Hash with no default block
        returns the canonical empty Hash

Immutable::Hash
  #dig
    returns the value with one argument to dig
    returns the value in nested hashes
    returns nil if the key is not present
    returns nil if you dig out the end of the hash
    raises a NoMethodError if a value does not support #dig
    returns the correct value when there is a default proc

Immutable::Hash
  #each
    with a block (internal iteration)
      returns self
      yields all key/value pairs
      yields key/value pairs in the same order as #each_key and #each_value
      yields both of a pair of colliding keys
      yields only the key to a block expecting |key,|
    with no block
      returns an Enumerator
  #each_pair
    with a block (internal iteration)
      returns self
      yields all key/value pairs
      yields key/value pairs in the same order as #each_key and #each_value
      yields both of a pair of colliding keys
      yields only the key to a block expecting |key,|
    with no block
      returns an Enumerator
  #each_key
    yields all keys
    with no block
      returns an Enumerator
  #each_value
    yields all values
    with no block
      returns an Enumerator

Immutable::Hash
  #each_with_index
    with a block (internal iteration)
      returns self
      yields all key/value pairs with numeric indexes
    with no block
      returns an Enumerator

Immutable::Hash
  #empty?
    returns true for []
    returns false for [{"A"=>"aye"}]
    returns false for [{"A"=>"aye", "B"=>"bee", "C"=>"see"}]
    returns true for empty hashes which have a default block
  .empty
    returns the canonical empty Hash
    from a subclass
      returns an empty instance of the subclass
      calls overridden #initialize when creating empty Hash

Immutable::Hash
  returns true on a large hash which is modified and then modified back again
  #eql?
    returns false when comparing with a standard hash
    returns false when comparing with an arbitrary object
    returns false when comparing with a subclass of Immutable::Hash
  #==
    returns true when comparing with a standard hash
    returns false when comparing with an arbitrary object
    returns true when comparing with a subclass of Immutable::Hash
    performs numeric conversions between floats and BigDecimals
  #eql?
    returns true
      for {} and {}
      for {} and {}
    returns false
      for {"A"=>"aye"} and {}
      for {} and {"A"=>"aye"}
    returns false
      for {} and {"A"=>"aye"}
      for {"A"=>"aye"} and {}
    returns true
      for {"A"=>"aye"} and {"A"=>"aye"}
      for {"A"=>"aye"} and {"A"=>"aye"}
    returns false
      for {"A"=>"aye"} and {"B"=>"bee"}
      for {"B"=>"bee"} and {"A"=>"aye"}
    returns false
      for {"A"=>"aye", "B"=>"bee"} and {"A"=>"aye"}
      for {"A"=>"aye"} and {"A"=>"aye", "B"=>"bee"}
    returns false
      for {"A"=>"aye"} and {"A"=>"aye", "B"=>"bee"}
      for {"A"=>"aye", "B"=>"bee"} and {"A"=>"aye"}
    returns true
      for {"A"=>"aye", "B"=>"bee", "C"=>"see"} and {"A"=>"aye", "B"=>"bee", "C"=>"see"}
      for {"A"=>"aye", "B"=>"bee", "C"=>"see"} and {"A"=>"aye", "B"=>"bee", "C"=>"see"}
    returns true
      for {"C"=>"see", "A"=>"aye", "B"=>"bee"} and {"A"=>"aye", "B"=>"bee", "C"=>"see"}
      for {"A"=>"aye", "B"=>"bee", "C"=>"see"} and {"C"=>"see", "A"=>"aye", "B"=>"bee"}
  #==
    returns true
      for {} and {}
      for {} and {}
    returns false
      for {"A"=>"aye"} and {}
      for {} and {"A"=>"aye"}
    returns false
      for {} and {"A"=>"aye"}
      for {"A"=>"aye"} and {}
    returns true
      for {"A"=>"aye"} and {"A"=>"aye"}
      for {"A"=>"aye"} and {"A"=>"aye"}
    returns false
      for {"A"=>"aye"} and {"B"=>"bee"}
      for {"B"=>"bee"} and {"A"=>"aye"}
    returns false
      for {"A"=>"aye", "B"=>"bee"} and {"A"=>"aye"}
      for {"A"=>"aye"} and {"A"=>"aye", "B"=>"bee"}
    returns false
      for {"A"=>"aye"} and {"A"=>"aye", "B"=>"bee"}
      for {"A"=>"aye", "B"=>"bee"} and {"A"=>"aye"}
    returns true
      for {"A"=>"aye", "B"=>"bee", "C"=>"see"} and {"A"=>"aye", "B"=>"bee", "C"=>"see"}
      for {"A"=>"aye", "B"=>"bee", "C"=>"see"} and {"A"=>"aye", "B"=>"bee", "C"=>"see"}
    returns true
      for {"C"=>"see", "A"=>"aye", "B"=>"bee"} and {"A"=>"aye", "B"=>"bee", "C"=>"see"}
      for {"A"=>"aye", "B"=>"bee", "C"=>"see"} and {"C"=>"see", "A"=>"aye", "B"=>"bee"}

Immutable::Hash
  #except
    works on a large Hash, with many combinations of input
    with only keys that the Hash has
      returns a Hash without those values
      doesn't change the original Hash
    with keys that the Hash doesn't have
      returns a Hash without the values that it had keys for
      doesn't change the original Hash

Immutable::Hash
  #fetch
    gives precedence to default block over default argument if passed both
    raises an ArgumentError when not passed one or 2 arguments
    with no default provided
      when the key exists
        returns the value associated with the key
      when the key does not exist
        raises a KeyError
    with a default value
      when the key exists
        returns the value associated with the key
      when the key does not exist
        returns the default value
    with a default block
      when the key exists
        returns the value associated with the key
      when the key does not exist
        invokes the default block with the missing key as paramter

Immutable::Hash
  #fetch_values
    when the all the requested keys exist
      returns a vector of values for the given keys
    when the key does not exist
      raises a KeyError

Immutable::Hash
  #find
    stops iterating when the block returns true
    on []
      with a block
        returns nil
      without a block
        returns an Enumerator
    on []
      with a block
        returns nil
      without a block
        returns an Enumerator
    on [{"A"=>"aye"}]
      with a block
        returns ["A", "aye"]
      without a block
        returns an Enumerator
    on [{"A"=>"aye"}]
      with a block
        returns nil
      without a block
        returns an Enumerator
    on [{"A"=>"aye"}]
      with a block
        returns nil
      without a block
        returns an Enumerator
    on [{"A"=>"aye", "B"=>"bee", nil=>"NIL"}]
      with a block
        returns ["A", "aye"]
      without a block
        returns an Enumerator
    on [{"A"=>"aye", "B"=>"bee", nil=>"NIL"}]
      with a block
        returns ["B", "bee"]
      without a block
        returns an Enumerator
    on [{"A"=>"aye", "B"=>"bee", nil=>"NIL"}]
      with a block
        returns [nil, "NIL"]
      without a block
        returns an Enumerator
    on [{"A"=>"aye", "B"=>"bee", nil=>"NIL"}]
      with a block
        returns nil
      without a block
        returns an Enumerator
  #detect
    stops iterating when the block returns true
    on []
      with a block
        returns nil
      without a block
        returns an Enumerator
    on []
      with a block
        returns nil
      without a block
        returns an Enumerator
    on [{"A"=>"aye"}]
      with a block
        returns ["A", "aye"]
      without a block
        returns an Enumerator
    on [{"A"=>"aye"}]
      with a block
        returns nil
      without a block
        returns an Enumerator
    on [{"A"=>"aye"}]
      with a block
        returns nil
      without a block
        returns an Enumerator
    on [{"A"=>"aye", "B"=>"bee", nil=>"NIL"}]
      with a block
        returns ["A", "aye"]
      without a block
        returns an Enumerator
    on [{"A"=>"aye", "B"=>"bee", nil=>"NIL"}]
      with a block
        returns ["B", "bee"]
      without a block
        returns an Enumerator
    on [{"A"=>"aye", "B"=>"bee", nil=>"NIL"}]
      with a block
        returns [nil, "NIL"]
      without a block
        returns an Enumerator
    on [{"A"=>"aye", "B"=>"bee", nil=>"NIL"}]
      with a block
        returns nil
      without a block
        returns an Enumerator

Immutable::Hash
  #flat_map
    yields each key/val pair
    returns the concatenation of block return values
    doesn't change the receiver
    returns an empty array if only empty arrays are returned by block
    with no block
      returns an Enumerator

Immutable::Hash
  #flatten
    with flatten depth of zero
      returns a vector of keys/value
    without array keys or values
      returns a vector of keys and values
      doesn't modify the receiver
    on an empty Hash
      returns an empty Vector
    with array keys
      flattens array keys into returned vector if flatten depth is sufficient
      doesn't modify the receiver (or its contents)
    with array values
      flattens array values into returned vector if flatten depth is sufficient
      doesn't modify the receiver (or its contents)
    with vector keys
      flattens vector keys into returned vector if flatten depth is sufficient
    with vector values
      flattens vector values into returned vector if flatten depth is sufficient

Immutable::Hash
  #get
    uses #hash to look up keys
    uses #eql? to compare keys with the same hash code
    does not use #eql? to compare keys with different hash codes
    with a default block
      when the key exists
        returns the value associated with the key
        does not call the default block even if the key is 'nil'
      when the key does not exist
        returns the value from the default block
    with no default block
      returns the value ("aye") for an existing key ("A")
      returns the value ("bee") for an existing key ("B")
      returns the value ("see") for an existing key ("C")
      returns the value ("NIL") for an existing key (nil)
      returns nil for a non-existing key
  #[]
    uses #hash to look up keys
    uses #eql? to compare keys with the same hash code
    does not use #eql? to compare keys with different hash codes
    with a default block
      when the key exists
        returns the value associated with the key
        does not call the default block even if the key is 'nil'
      when the key does not exist
        returns the value from the default block
    with no default block
      returns the value ("aye") for an existing key ("A")
      returns the value ("bee") for an existing key ("B")
      returns the value ("see") for an existing key ("C")
      returns the value ("NIL") for an existing key (nil)
      returns nil for a non-existing key

Immutable::Hash
  #key?
    returns true for an existing key ("A")
    returns true for an existing key ("B")
    returns true for an existing key ("C")
    returns true for an existing key (nil)
    returns true for an existing key (2.0)
    returns false for a non-existing key
    uses #eql? for equality
    returns true if the key is found and maps to nil
    returns true if the key is found and maps to false
  #has_key?
    returns true for an existing key ("A")
    returns true for an existing key ("B")
    returns true for an existing key ("C")
    returns true for an existing key (nil)
    returns true for an existing key (2.0)
    returns false for a non-existing key
    uses #eql? for equality
    returns true if the key is found and maps to nil
    returns true if the key is found and maps to false
  #include?
    returns true for an existing key ("A")
    returns true for an existing key ("B")
    returns true for an existing key ("C")
    returns true for an existing key (nil)
    returns true for an existing key (2.0)
    returns false for a non-existing key
    uses #eql? for equality
    returns true if the key is found and maps to nil
    returns true if the key is found and maps to false
  #member?
    returns true for an existing key ("A")
    returns true for an existing key ("B")
    returns true for an existing key ("C")
    returns true for an existing key (nil)
    returns true for an existing key (2.0)
    returns false for a non-existing key
    uses #eql? for equality
    returns true if the key is found and maps to nil
    returns true if the key is found and maps to false

Immutable::Hash
  #value?
    returns true if any key/val pair in Hash has the same value
    returns false if no key/val pair in Hash has the same value
    uses #== to check equality
    works on a large hash
  #has_value?
    returns true if any key/val pair in Hash has the same value
    returns false if no key/val pair in Hash has the same value
    uses #== to check equality
    works on a large hash

Immutable::Hash
  #hash
    values are sufficiently distributed
    differs given the same keys and different values
    differs given the same values and different keys
    generates the same hash value for a hash regardless of the order things were added to it
    on an empty hash
      returns 0

Immutable::Hash
  #inspect
    on []
      returns "Immutable::Hash[]"
    on [{"A"=>"aye"}]
      returns "Immutable::Hash[\"A\" => \"aye\"]"
    on [{"A"=>"aye", "B"=>"bee", "C"=>"see"}]
      returns "Immutable::Hash[\"A\" => \"aye\", \"B\" => \"bee\", \"C\" => \"see\"]"
    on {}
      returns a string which can be eval'd to get an equivalent object
    on {"A"=>"aye"}
      returns a string which can be eval'd to get an equivalent object
    on {:a=>"aye", :b=>"bee", :c=>"see"}
      returns a string which can be eval'd to get an equivalent object

Immutable::Hash
  #invert
    uses the existing keys as values and values as keys
    will select one key/value pair among multiple which have same value
    doesn't change the original Hash
    from a subclass of Hash
      returns an instance of the subclass

Immutable::Hash
  #key
    returns a key associated with the given value, if there is one
    returns nil if there is no key associated with the given value
    uses #== to compare values for equality
    doesn't use default block if value is not found

Immutable::Hash
  #keys
    returns the keys as a set
    returns frozen String keys

Immutable::Hash
  #map
    when empty
      returns self
    when not empty
      with a block
        preserves the original values
        returns a new hash with the mapped values
      with no block
        returns an Enumerator
    from a subclass
      returns an instance of the subclass
  #collect
    when empty
      returns self
    when not empty
      with a block
        preserves the original values
        returns a new hash with the mapped values
      with no block
        returns an Enumerator
    from a subclass
      returns an instance of the subclass

Immutable::Hash
  #marshal_dump/#marshal_load
    can survive dumping and loading into a new process
    is still possible to find items by key after loading

Immutable::Hash
  #merge
    sets any duplicate key to the value of block if passed a block
    yields key/value pairs in the same order as #each
    for {} and {}
      returns {} when passed an Immutable::Hash
      returns {} when passed a Ruby Hash
      doesn't change the original Hashes
    for {"A"=>"aye"} and {}
      returns {"A"=>"aye"} when passed an Immutable::Hash
      returns {"A"=>"aye"} when passed a Ruby Hash
      doesn't change the original Hashes
    for {"A"=>"aye"} and {"A"=>"bee"}
      returns {"A"=>"bee"} when passed an Immutable::Hash
      returns {"A"=>"bee"} when passed a Ruby Hash
      doesn't change the original Hashes
    for {"A"=>"aye"} and {"B"=>"bee"}
      returns {"A"=>"aye", "B"=>"bee"} when passed an Immutable::Hash
      returns {"A"=>"aye", "B"=>"bee"} when passed a Ruby Hash
      doesn't change the original Hashes
    for [[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6], [7, 7], [8, 8], [9, 9], [10, 10], [11, 11], [12, 12], [13, 13], [14, 14], [15, 15], [16, 16], [17, 17], [18, 18], [19, 19], [20, 20], [21, 21], [22, 22], [23, 23], [24, 24], [25, 25], [26, 26], [27, 27], [28, 28], [29, 29], [30, 30], [31, 31], [32, 32], [33, 33], [34, 34], [35, 35], [36, 36], [37, 37], [38, 38], [39, 39], [40, 40], [41, 41], [42, 42], [43, 43], [44, 44], [45, 45], [46, 46], [47, 47], [48, 48], [49, 49], [50, 50], [51, 51], [52, 52], [53, 53], [54, 54], [55, 55], [56, 56], [57, 57], [58, 58], [59, 59], [60, 60], [61, 61], [62, 62], [63, 63], [64, 64], [65, 65], [66, 66], [67, 67], [68, 68], [69, 69], [70, 70], [71, 71], [72, 72], [73, 73], [74, 74], [75, 75], [76, 76], [77, 77], [78, 78], [79, 79], [80, 80], [81, 81], [82, 82], [83, 83], [84, 84], [85, 85], [86, 86], [87, 87], [88, 88], [89, 89], [90, 90], [91, 91], [92, 92], [93, 93], [94, 94], [95, 95], [96, 96], [97, 97], [98, 98], [99, 99], [100, 100], [101, 101], [102, 102], [103, 103], [104, 104], [105, 105], [106, 106], [107, 107], [108, 108], [109, 109], [110, 110], [111, 111], [112, 112], [113, 113], [114, 114], [115, 115], [116, 116], [117, 117], [118, 118], [119, 119], [120, 120], [121, 121], [122, 122], [123, 123], [124, 124], [125, 125], [126, 126], [127, 127], [128, 128], [129, 129], [130, 130], [131, 131], [132, 132], [133, 133], [134, 134], [135, 135], [136, 136], [137, 137], [138, 138], [139, 139], [140, 140], [141, 141], [142, 142], [143, 143], [144, 144], [145, 145], [146, 146], [147, 147], [148, 148], [149, 149], [150, 150], [151, 151], [152, 152], [153, 153], [154, 154], [155, 155], [156, 156], [157, 157], [158, 158], [159, 159], [160, 160], [161, 161], [162, 162], [163, 163], [164, 164], [165, 165], [166, 166], [167, 167], [168, 168], [169, 169], [170, 170], [171, 171], [172, 172], [173, 173], [174, 174], [175, 175], [176, 176], [177, 177], [178, 178], [179, 179], [180, 180], [181, 181], [182, 182], [183, 183], [184, 184], [185, 185], [186, 186], [187, 187], [188, 188], [189, 189], [190, 190], [191, 191], [192, 192], [193, 193], [194, 194], [195, 195], [196, 196], [197, 197], [198, 198], [199, 199], [200, 200], [201, 201], [202, 202], [203, 203], [204, 204], [205, 205], [206, 206], [207, 207], [208, 208], [209, 209], [210, 210], [211, 211], [212, 212], [213, 213], [214, 214], [215, 215], [216, 216], [217, 217], [218, 218], [219, 219], [220, 220], [221, 221], [222, 222], [223, 223], [224, 224], [225, 225], [226, 226], [227, 227], [228, 228], [229, 229], [230, 230], [231, 231], [232, 232], [233, 233], [234, 234], [235, 235], [236, 236], [237, 237], [238, 238], [239, 239], [240, 240], [241, 241], [242, 242], [243, 243], [244, 244], [245, 245], [246, 246], [247, 247], [248, 248], [249, 249], [250, 250], [251, 251], [252, 252], [253, 253], [254, 254], [255, 255], [256, 256], [257, 257], [258, 258], [259, 259], [260, 260], [261, 261], [262, 262], [263, 263], [264, 264], [265, 265], [266, 266], [267, 267], [268, 268], [269, 269], [270, 270], [271, 271], [272, 272], [273, 273], [274, 274], [275, 275], [276, 276], [277, 277], [278, 278], [279, 279], [280, 280], [281, 281], [282, 282], [283, 283], [284, 284], [285, 285], [286, 286], [287, 287], [288, 288], [289, 289], [290, 290], [291, 291], [292, 292], [293, 293], [294, 294], [295, 295], [296, 296], [297, 297], [298, 298], [299, 299], [300, 300]] and [[150, 150], [151, 151], [152, 152], [153, 153], [154, 154], [155, 155], [156, 156], [157, 157], [158, 158], [159, 159], [160, 160], [161, 161], [162, 162], [163, 163], [164, 164], [165, 165], [166, 166], [167, 167], [168, 168], [169, 169], [170, 170], [171, 171], [172, 172], [173, 173], [174, 174], [175, 175], [176, 176], [177, 177], [178, 178], [179, 179], [180, 180], [181, 181], [182, 182], [183, 183], [184, 184], [185, 185], [186, 186], [187, 187], [188, 188], [189, 189], [190, 190], [191, 191], [192, 192], [193, 193], [194, 194], [195, 195], [196, 196], [197, 197], [198, 198], [199, 199], [200, 200], [201, 201], [202, 202], [203, 203], [204, 204], [205, 205], [206, 206], [207, 207], [208, 208], [209, 209], [210, 210], [211, 211], [212, 212], [213, 213], [214, 214], [215, 215], [216, 216], [217, 217], [218, 218], [219, 219], [220, 220], [221, 221], [222, 222], [223, 223], [224, 224], [225, 225], [226, 226], [227, 227], [228, 228], [229, 229], [230, 230], [231, 231], [232, 232], [233, 233], [234, 234], [235, 235], [236, 236], [237, 237], [238, 238], [239, 239], [240, 240], [241, 241], [242, 242], [243, 243], [244, 244], [245, 245], [246, 246], [247, 247], [248, 248], [249, 249], [250, 250], [251, 251], [252, 252], [253, 253], [254, 254], [255, 255], [256, 256], [257, 257], [258, 258], [259, 259], [260, 260], [261, 261], [262, 262], [263, 263], [264, 264], [265, 265], [266, 266], [267, 267], [268, 268], [269, 269], [270, 270], [271, 271], [272, 272], [273, 273], [274, 274], [275, 275], [276, 276], [277, 277], [278, 278], [279, 279], [280, 280], [281, 281], [282, 282], [283, 283], [284, 284], [285, 285], [286, 286], [287, 287], [288, 288], [289, 289], [290, 290], [291, 291], [292, 292], [293, 293], [294, 294], [295, 295], [296, 296], [297, 297], [298, 298], [299, 299], [300, 300], [301, 301], [302, 302], [303, 303], [304, 304], [305, 305], [306, 306], [307, 307], [308, 308], [309, 309], [310, 310], [311, 311], [312, 312], [313, 313], [314, 314], [315, 315], [316, 316], [317, 317], [318, 318], [319, 319], [320, 320], [321, 321], [322, 322], [323, 323], [324, 324], [325, 325], [326, 326], [327, 327], [328, 328], [329, 329], [330, 330], [331, 331], [332, 332], [333, 333], [334, 334], [335, 335], [336, 336], [337, 337], [338, 338], [339, 339], [340, 340], [341, 341], [342, 342], [343, 343], [344, 344], [345, 345], [346, 346], [347, 347], [348, 348], [349, 349], [350, 350], [351, 351], [352, 352], [353, 353], [354, 354], [355, 355], [356, 356], [357, 357], [358, 358], [359, 359], [360, 360], [361, 361], [362, 362], [363, 363], [364, 364], [365, 365], [366, 366], [367, 367], [368, 368], [369, 369], [370, 370], [371, 371], [372, 372], [373, 373], [374, 374], [375, 375], [376, 376], [377, 377], [378, 378], [379, 379], [380, 380], [381, 381], [382, 382], [383, 383], [384, 384], [385, 385], [386, 386], [387, 387], [388, 388], [389, 389], [390, 390], [391, 391], [392, 392], [393, 393], [394, 394], [395, 395], [396, 396], [397, 397], [398, 398], [399, 399], [400, 400], [401, 401], [402, 402], [403, 403], [404, 404], [405, 405], [406, 406], [407, 407], [408, 408], [409, 409], [410, 410], [411, 411], [412, 412], [413, 413], [414, 414], [415, 415], [416, 416], [417, 417], [418, 418], [419, 419], [420, 420], [421, 421], [422, 422], [423, 423], [424, 424], [425, 425], [426, 426], [427, 427], [428, 428], [429, 429], [430, 430], [431, 431], [432, 432], [433, 433], [434, 434], [435, 435], [436, 436], [437, 437], [438, 438], [439, 439], [440, 440], [441, 441], [442, 442], [443, 443], [444, 444], [445, 445], [446, 446], [447, 447], [448, 448], [449, 449], [450, 450]]
      returns [[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6], [7, 7], [8, 8], [9, 9], [10, 10], [11, 11], [12, 12], [13, 13], [14, 14], [15, 15], [16, 16], [17, 17], [18, 18], [19, 19], [20, 20], [21, 21], [22, 22], [23, 23], [24, 24], [25, 25], [26, 26], [27, 27], [28, 28], [29, 29], [30, 30], [31, 31], [32, 32], [33, 33], [34, 34], [35, 35], [36, 36], [37, 37], [38, 38], [39, 39], [40, 40], [41, 41], [42, 42], [43, 43], [44, 44], [45, 45], [46, 46], [47, 47], [48, 48], [49, 49], [50, 50], [51, 51], [52, 52], [53, 53], [54, 54], [55, 55], [56, 56], [57, 57], [58, 58], [59, 59], [60, 60], [61, 61], [62, 62], [63, 63], [64, 64], [65, 65], [66, 66], [67, 67], [68, 68], [69, 69], [70, 70], [71, 71], [72, 72], [73, 73], [74, 74], [75, 75], [76, 76], [77, 77], [78, 78], [79, 79], [80, 80], [81, 81], [82, 82], [83, 83], [84, 84], [85, 85], [86, 86], [87, 87], [88, 88], [89, 89], [90, 90], [91, 91], [92, 92], [93, 93], [94, 94], [95, 95], [96, 96], [97, 97], [98, 98], [99, 99], [100, 100], [101, 101], [102, 102], [103, 103], [104, 104], [105, 105], [106, 106], [107, 107], [108, 108], [109, 109], [110, 110], [111, 111], [112, 112], [113, 113], [114, 114], [115, 115], [116, 116], [117, 117], [118, 118], [119, 119], [120, 120], [121, 121], [122, 122], [123, 123], [124, 124], [125, 125], [126, 126], [127, 127], [128, 128], [129, 129], [130, 130], [131, 131], [132, 132], [133, 133], [134, 134], [135, 135], [136, 136], [137, 137], [138, 138], [139, 139], [140, 140], [141, 141], [142, 142], [143, 143], [144, 144], [145, 145], [146, 146], [147, 147], [148, 148], [149, 149], [150, 150], [151, 151], [152, 152], [153, 153], [154, 154], [155, 155], [156, 156], [157, 157], [158, 158], [159, 159], [160, 160], [161, 161], [162, 162], [163, 163], [164, 164], [165, 165], [166, 166], [167, 167], [168, 168], [169, 169], [170, 170], [171, 171], [172, 172], [173, 173], [174, 174], [175, 175], [176, 176], [177, 177], [178, 178], [179, 179], [180, 180], [181, 181], [182, 182], [183, 183], [184, 184], [185, 185], [186, 186], [187, 187], [188, 188], [189, 189], [190, 190], [191, 191], [192, 192], [193, 193], [194, 194], [195, 195], [196, 196], [197, 197], [198, 198], [199, 199], [200, 200], [201, 201], [202, 202], [203, 203], [204, 204], [205, 205], [206, 206], [207, 207], [208, 208], [209, 209], [210, 210], [211, 211], [212, 212], [213, 213], [214, 214], [215, 215], [216, 216], [217, 217], [218, 218], [219, 219], [220, 220], [221, 221], [222, 222], [223, 223], [224, 224], [225, 225], [226, 226], [227, 227], [228, 228], [229, 229], [230, 230], [231, 231], [232, 232], [233, 233], [234, 234], [235, 235], [236, 236], [237, 237], [238, 238], [239, 239], [240, 240], [241, 241], [242, 242], [243, 243], [244, 244], [245, 245], [246, 246], [247, 247], [248, 248], [249, 249], [250, 250], [251, 251], [252, 252], [253, 253], [254, 254], [255, 255], [256, 256], [257, 257], [258, 258], [259, 259], [260, 260], [261, 261], [262, 262], [263, 263], [264, 264], [265, 265], [266, 266], [267, 267], [268, 268], [269, 269], [270, 270], [271, 271], [272, 272], [273, 273], [274, 274], [275, 275], [276, 276], [277, 277], [278, 278], [279, 279], [280, 280], [281, 281], [282, 282], [283, 283], [284, 284], [285, 285], [286, 286], [287, 287], [288, 288], [289, 289], [290, 290], [291, 291], [292, 292], [293, 293], [294, 294], [295, 295], [296, 296], [297, 297], [298, 298], [299, 299], [300, 300], [301, 301], [302, 302], [303, 303], [304, 304], [305, 305], [306, 306], [307, 307], [308, 308], [309, 309], [310, 310], [311, 311], [312, 312], [313, 313], [314, 314], [315, 315], [316, 316], [317, 317], [318, 318], [319, 319], [320, 320], [321, 321], [322, 322], [323, 323], [324, 324], [325, 325], [326, 326], [327, 327], [328, 328], [329, 329], [330, 330], [331, 331], [332, 332], [333, 333], [334, 334], [335, 335], [336, 336], [337, 337], [338, 338], [339, 339], [340, 340], [341, 341], [342, 342], [343, 343], [344, 344], [345, 345], [346, 346], [347, 347], [348, 348], [349, 349], [350, 350], [351, 351], [352, 352], [353, 353], [354, 354], [355, 355], [356, 356], [357, 357], [358, 358], [359, 359], [360, 360], [361, 361], [362, 362], [363, 363], [364, 364], [365, 365], [366, 366], [367, 367], [368, 368], [369, 369], [370, 370], [371, 371], [372, 372], [373, 373], [374, 374], [375, 375], [376, 376], [377, 377], [378, 378], [379, 379], [380, 380], [381, 381], [382, 382], [383, 383], [384, 384], [385, 385], [386, 386], [387, 387], [388, 388], [389, 389], [390, 390], [391, 391], [392, 392], [393, 393], [394, 394], [395, 395], [396, 396], [397, 397], [398, 398], [399, 399], [400, 400], [401, 401], [402, 402], [403, 403], [404, 404], [405, 405], [406, 406], [407, 407], [408, 408], [409, 409], [410, 410], [411, 411], [412, 412], [413, 413], [414, 414], [415, 415], [416, 416], [417, 417], [418, 418], [419, 419], [420, 420], [421, 421], [422, 422], [423, 423], [424, 424], [425, 425], [426, 426], [427, 427], [428, 428], [429, 429], [430, 430], [431, 431], [432, 432], [433, 433], [434, 434], [435, 435], [436, 436], [437, 437], [438, 438], [439, 439], [440, 440], [441, 441], [442, 442], [443, 443], [444, 444], [445, 445], [446, 446], [447, 447], [448, 448], [449, 449], [450, 450]] when passed an Immutable::Hash
      returns [[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6], [7, 7], [8, 8], [9, 9], [10, 10], [11, 11], [12, 12], [13, 13], [14, 14], [15, 15], [16, 16], [17, 17], [18, 18], [19, 19], [20, 20], [21, 21], [22, 22], [23, 23], [24, 24], [25, 25], [26, 26], [27, 27], [28, 28], [29, 29], [30, 30], [31, 31], [32, 32], [33, 33], [34, 34], [35, 35], [36, 36], [37, 37], [38, 38], [39, 39], [40, 40], [41, 41], [42, 42], [43, 43], [44, 44], [45, 45], [46, 46], [47, 47], [48, 48], [49, 49], [50, 50], [51, 51], [52, 52], [53, 53], [54, 54], [55, 55], [56, 56], [57, 57], [58, 58], [59, 59], [60, 60], [61, 61], [62, 62], [63, 63], [64, 64], [65, 65], [66, 66], [67, 67], [68, 68], [69, 69], [70, 70], [71, 71], [72, 72], [73, 73], [74, 74], [75, 75], [76, 76], [77, 77], [78, 78], [79, 79], [80, 80], [81, 81], [82, 82], [83, 83], [84, 84], [85, 85], [86, 86], [87, 87], [88, 88], [89, 89], [90, 90], [91, 91], [92, 92], [93, 93], [94, 94], [95, 95], [96, 96], [97, 97], [98, 98], [99, 99], [100, 100], [101, 101], [102, 102], [103, 103], [104, 104], [105, 105], [106, 106], [107, 107], [108, 108], [109, 109], [110, 110], [111, 111], [112, 112], [113, 113], [114, 114], [115, 115], [116, 116], [117, 117], [118, 118], [119, 119], [120, 120], [121, 121], [122, 122], [123, 123], [124, 124], [125, 125], [126, 126], [127, 127], [128, 128], [129, 129], [130, 130], [131, 131], [132, 132], [133, 133], [134, 134], [135, 135], [136, 136], [137, 137], [138, 138], [139, 139], [140, 140], [141, 141], [142, 142], [143, 143], [144, 144], [145, 145], [146, 146], [147, 147], [148, 148], [149, 149], [150, 150], [151, 151], [152, 152], [153, 153], [154, 154], [155, 155], [156, 156], [157, 157], [158, 158], [159, 159], [160, 160], [161, 161], [162, 162], [163, 163], [164, 164], [165, 165], [166, 166], [167, 167], [168, 168], [169, 169], [170, 170], [171, 171], [172, 172], [173, 173], [174, 174], [175, 175], [176, 176], [177, 177], [178, 178], [179, 179], [180, 180], [181, 181], [182, 182], [183, 183], [184, 184], [185, 185], [186, 186], [187, 187], [188, 188], [189, 189], [190, 190], [191, 191], [192, 192], [193, 193], [194, 194], [195, 195], [196, 196], [197, 197], [198, 198], [199, 199], [200, 200], [201, 201], [202, 202], [203, 203], [204, 204], [205, 205], [206, 206], [207, 207], [208, 208], [209, 209], [210, 210], [211, 211], [212, 212], [213, 213], [214, 214], [215, 215], [216, 216], [217, 217], [218, 218], [219, 219], [220, 220], [221, 221], [222, 222], [223, 223], [224, 224], [225, 225], [226, 226], [227, 227], [228, 228], [229, 229], [230, 230], [231, 231], [232, 232], [233, 233], [234, 234], [235, 235], [236, 236], [237, 237], [238, 238], [239, 239], [240, 240], [241, 241], [242, 242], [243, 243], [244, 244], [245, 245], [246, 246], [247, 247], [248, 248], [249, 249], [250, 250], [251, 251], [252, 252], [253, 253], [254, 254], [255, 255], [256, 256], [257, 257], [258, 258], [259, 259], [260, 260], [261, 261], [262, 262], [263, 263], [264, 264], [265, 265], [266, 266], [267, 267], [268, 268], [269, 269], [270, 270], [271, 271], [272, 272], [273, 273], [274, 274], [275, 275], [276, 276], [277, 277], [278, 278], [279, 279], [280, 280], [281, 281], [282, 282], [283, 283], [284, 284], [285, 285], [286, 286], [287, 287], [288, 288], [289, 289], [290, 290], [291, 291], [292, 292], [293, 293], [294, 294], [295, 295], [296, 296], [297, 297], [298, 298], [299, 299], [300, 300], [301, 301], [302, 302], [303, 303], [304, 304], [305, 305], [306, 306], [307, 307], [308, 308], [309, 309], [310, 310], [311, 311], [312, 312], [313, 313], [314, 314], [315, 315], [316, 316], [317, 317], [318, 318], [319, 319], [320, 320], [321, 321], [322, 322], [323, 323], [324, 324], [325, 325], [326, 326], [327, 327], [328, 328], [329, 329], [330, 330], [331, 331], [332, 332], [333, 333], [334, 334], [335, 335], [336, 336], [337, 337], [338, 338], [339, 339], [340, 340], [341, 341], [342, 342], [343, 343], [344, 344], [345, 345], [346, 346], [347, 347], [348, 348], [349, 349], [350, 350], [351, 351], [352, 352], [353, 353], [354, 354], [355, 355], [356, 356], [357, 357], [358, 358], [359, 359], [360, 360], [361, 361], [362, 362], [363, 363], [364, 364], [365, 365], [366, 366], [367, 367], [368, 368], [369, 369], [370, 370], [371, 371], [372, 372], [373, 373], [374, 374], [375, 375], [376, 376], [377, 377], [378, 378], [379, 379], [380, 380], [381, 381], [382, 382], [383, 383], [384, 384], [385, 385], [386, 386], [387, 387], [388, 388], [389, 389], [390, 390], [391, 391], [392, 392], [393, 393], [394, 394], [395, 395], [396, 396], [397, 397], [398, 398], [399, 399], [400, 400], [401, 401], [402, 402], [403, 403], [404, 404], [405, 405], [406, 406], [407, 407], [408, 408], [409, 409], [410, 410], [411, 411], [412, 412], [413, 413], [414, 414], [415, 415], [416, 416], [417, 417], [418, 418], [419, 419], [420, 420], [421, 421], [422, 422], [423, 423], [424, 424], [425, 425], [426, 426], [427, 427], [428, 428], [429, 429], [430, 430], [431, 431], [432, 432], [433, 433], [434, 434], [435, 435], [436, 436], [437, 437], [438, 438], [439, 439], [440, 440], [441, 441], [442, 442], [443, 443], [444, 444], [445, 445], [446, 446], [447, 447], [448, 448], [449, 449], [450, 450]] when passed a Ruby Hash
      doesn't change the original Hashes
    when merging with an empty Hash
      returns self
    when merging with subset Hash
      returns self
    when called on a subclass
      returns an instance of the subclass

Immutable::Hash
  #min
    returns the smallest key/val pair
  #max
    returns the largest key/val pair
  #min_by
    returns the smallest key/val pair (after passing it through a key function)
    returns the first key/val pair yielded by #each in case of a tie
    returns nil if the hash is empty
  #max_by
    returns the largest key/val pair (after passing it through a key function)
    returns the first key/val pair yielded by #each in case of a tie
    returns nil if the hash is empty

Immutable::Hash
  .new
    is amenable to overriding of #initialize
    accepts an array as initializer
    returns a Hash which doesn't change even if initializer is mutated
    from a subclass
      returns a frozen instance of the subclass
  .[]
    accepts a Ruby Hash as initializer
    accepts a Immutable::Hash as initializer
    accepts an array as initializer
    can be used with a subclass of Immutable::Hash

Immutable::Hash
  #none?
    when empty
      with a block returns true
      with no block returns true
    when not empty
      with a block
        returns false if the block ever returns true (["A", "aye"])
        returns true if the block always returns false
        stops iterating as soon as the block returns true
        returns false if the block ever returns true (["B", "bee"])
        returns true if the block always returns false
        stops iterating as soon as the block returns true
        returns false if the block ever returns true (["C", "see"])
        returns true if the block always returns false
        stops iterating as soon as the block returns true
        returns false if the block ever returns true ([nil, "NIL"])
        returns true if the block always returns false
        stops iterating as soon as the block returns true
      with no block
        returns false

Immutable::Hash
  #partition
    returns a pair of Immutable::Hashes
    returns key/val pairs for which predicate is true in first Hash
    returns key/val pairs for which predicate is false in second Hash
    doesn't modify the original Hash
    from a subclass
      should return instances of the subclass

Immutable::Hash
  #pretty_print
    prints the whole Hash on one line if it fits
    prints each key/val pair on its own line, if not
    prints keys and vals on separate lines, if space is very tight

Immutable::Hash
  #[]=
    raises error pointing to #put
  #put
    with a block
      passes the value to the block
      replaces the value with the result of the block
      supports to_proc methods
      if there is no existing association
        passes nil to the block
        stores the result of the block as the new value
    with a unique key
      preserves the original
      returns a copy with the superset of key/value pairs
    with a duplicate key
      preserves the original
      returns a copy with the superset of key/value pairs
    with duplicate key and identical value
      returns the original hash unmodified
      with big hash (force nested tries)
        returns the original hash unmodified for all changes
    with unequal keys which hash to the same value
      stores and can retrieve both
    when a String is inserted as key and then mutated
      is not affected

Immutable::Hash
  #reduce
    when empty
      returns the memo
    when not empty
      with a block
        returns the final memo
      with no block
        uses a passed string as the name of a method to use instead
        uses a passed symbol as the name of a method to use instead
  #inject
    when empty
      returns the memo
    when not empty
      with a block
        returns the final memo
      with no block
        uses a passed string as the name of a method to use instead
        uses a passed symbol as the name of a method to use instead

Immutable::Hash
  #reject
    when nothing matches
      returns self
    when only some things match
      with a block
        preserves the original
        returns a set with the matching values
        yields entries in the same order as #each
      with no block
        returns an Enumerator
      on a large hash, with many combinations of input
        still works
  #delete_if
    when nothing matches
      returns self
    when only some things match
      with a block
        preserves the original
        returns a set with the matching values
        yields entries in the same order as #each
      with no block
        returns an Enumerator
      on a large hash, with many combinations of input
        still works

Immutable::Hash
  #reverse_each
    with a block
      returns self
      yields all key/value pairs in the opposite order as #each
    with no block
      returns an Enumerator

Immutable::Hash
  #sample
    returns a randomly chosen item

Immutable::Hash
  #select
    works on a large hash, with many combinations of input
    when everything matches
      returns self
    when only some things match
      yields entries as [key, value] pairs
      with a block
        preserves the original
        returns a set with the matching values
      with no block
        returns an Enumerator
  #find_all
    works on a large hash, with many combinations of input
    when everything matches
      returns self
    when only some things match
      yields entries as [key, value] pairs
      with a block
        preserves the original
        returns a set with the matching values
      with no block
        returns an Enumerator
  #keep_if
    works on a large hash, with many combinations of input
    when everything matches
      returns self
    when only some things match
      yields entries as [key, value] pairs
      with a block
        preserves the original
        returns a set with the matching values
      with no block
        returns an Enumerator

Immutable::Hash
  #size
    returns 0 for []
    returns 1 for [{"A"=>"aye"}]
    returns 3 for [{"A"=>"bee", "B"=>"bee", "C"=>"see"}]
    has the correct size after adding lots of things with colliding keys and such
    has the correct size after lots of addings and removings
  #length
    returns 0 for []
    returns 1 for [{"A"=>"aye"}]
    returns 3 for [{"A"=>"bee", "B"=>"bee", "C"=>"see"}]
    has the correct size after adding lots of things with colliding keys and such
    has the correct size after lots of addings and removings

Immutable::Hash
  #slice
    with all keys present in the Hash
      returns the sliced values
      doesn't modify the original Hash
    with keys aren't present in the Hash
      returns the sliced values of the matching keys
      doesn't modify the original Hash
    on a Hash with a default block
      maintains the default block

Immutable::Hash
  #sort
    returns a Vector of sorted key/val pairs
    works on large hashes
    uses block as comparator to sort if passed a block
  #sort_by
    returns a Vector of key/val pairs, sorted using the block as a key function

Immutable::Hash
  #store
    with a unique key
      preserves the original
      returns a copy with the superset of key/value pairs
    with a duplicate key
      preserves the original
      returns a copy with the superset of key/value pairs
    with duplicate key and identical value
      returns the original hash unmodified
      with big hash (force nested tries)
        returns the original hash unmodified for all changes
    with unequal keys which hash to the same value
      stores and can retrieve both
    when a String is inserted as key and then mutated
      is not affected

Immutable::Hash
  #<=
    for {} and {}
      returns true
    for {"A"=>1} and {}
      returns false
    for {} and {"A"=>1}
      returns true
    for {"A"=>1} and {"A"=>1}
      returns true
    for {"A"=>1} and {"A"=>2}
      returns false
    for {"B"=>2} and {"A"=>1, "B"=>2, "C"=>3}
      returns true
    for {"A"=>1, "B"=>2, "C"=>3} and {"B"=>2}
      returns false
    for {"B"=>0} and {"A"=>1, "B"=>2, "C"=>3}
      returns false
  #<
    for {} and {}
      returns false
    for {"A"=>1} and {}
      returns false
    for {} and {"A"=>1}
      returns true
    for {"A"=>1} and {"A"=>1}
      returns false
    for {"A"=>1} and {"A"=>2}
      returns false
    for {"B"=>2} and {"A"=>1, "B"=>2, "C"=>3}
      returns true
    for {"A"=>1, "B"=>2, "C"=>3} and {"B"=>2}
      returns false
    for {"B"=>0} and {"A"=>1, "B"=>2, "C"=>3}
      returns false

Immutable::Hash
  #>=
    for {} and {}
      returns true
    for {"A"=>1} and {}
      returns true
    for {} and {"A"=>1}
      returns false
    for {"A"=>1} and {"A"=>1}
      returns true
    for {"A"=>1} and {"A"=>2}
      returns false
    for {"A"=>1, "B"=>2, "C"=>3} and {"B"=>2}
      returns true
    for {"B"=>2} and {"A"=>1, "B"=>2, "C"=>3}
      returns false
    for {"A"=>1, "B"=>2, "C"=>3} and {"B"=>0}
      returns false
  #>
    for {} and {}
      returns false
    for {"A"=>1} and {}
      returns true
    for {} and {"A"=>1}
      returns false
    for {"A"=>1} and {"A"=>1}
      returns false
    for {"A"=>1} and {"A"=>2}
      returns false
    for {"A"=>1, "B"=>2, "C"=>3} and {"B"=>2}
      returns true
    for {"B"=>2} and {"A"=>1, "B"=>2, "C"=>3}
      returns false
    for {"A"=>1, "B"=>2, "C"=>3} and {"B"=>0}
      returns false

Immutable::Hash
  #take
    returns the first N key/val pairs from hash
  #take_while
    passes elements to the block until the block returns nil/false
    returns an array of all elements before the one which returned nil/false
    passes all elements if the block never returns nil/false

Immutable::Hash
  #to_a
    returns an Array of [key, value] pairs in same order as #each

Immutable::Hash
  #to_hash
    converts an empty Immutable::Hash to an empty Ruby Hash
    converts a non-empty Immutable::Hash to a Hash with the same keys and values
    doesn't modify the receiver
  #to_h
    converts an empty Immutable::Hash to an empty Ruby Hash
    converts a non-empty Immutable::Hash to a Hash with the same keys and values
    doesn't modify the receiver

Immutable::Hash
  #to_proc
    on Hash without default proc
      returns a Proc instance
      returns a Proc that returns the value of an existing key
      returns a Proc that returns nil for a missing key
    on Hash with a default proc
      returns a Proc instance
      returns a Proc that returns the value of an existing key
      returns a Proc that returns the result of the hash's default proc for a missing key

Immutable::Hash
  #update_in
    with one level on existing key
      passes the value to the block
      replaces the value with the result of the block
      should preserve the original
    with multi-level on existing keys
      passes the value to the block
      replaces the value with the result of the block
      should preserve the original
    with multi-level creating sub-hashes when keys don't exist
      passes nil to the block
      creates subhashes on the way to set the value
    with multi-level including vector with existing keys
      passes the value to the block
      replaces the value with the result of the block
      should preserve the original
    with empty key_path
      raises ArguemntError

Immutable::Hash
  #values_at
    on Hash without default proc
      returns an empty vector when no keys are given
      returns a vector of values for the given keys
      fills nil when keys are missing
    on Hash with default proc
      fills the result of the default proc when keys are missing

Immutable::Hash
  #values
    returns the keys as a Vector
    with duplicates
      returns the keys as a Vector

Immutable::List
  #add
    on [] with "A"
      preserves the original
      returns ["A"]
    on ["A"] with "B"
      preserves the original
      returns ["B", "A"]
    on ["A"] with "A"
      preserves the original
      returns ["A", "A"]
    on ["A", "B", "C"] with "D"
      preserves the original
      returns ["D", "A", "B", "C"]

Immutable::List
  #all?
    on a really big list
      doesn't run out of stack
    when empty
      with a block returns true
      with no block returns true
    when not empty
      with a block
        if the block always returns true
          returns true
        if the block ever returns false
          returns false
      with no block
        if all values are truthy
          returns true
        if any value is nil
          returns false
        if any value is false
          returns false

Immutable::List
  #any?
    on a really big list
      doesn't run out of stack
    when empty
      with a block returns false
      with no block returns false
    when not empty
      with a block
        returns true if the block ever returns true ("A")
        returns true if the block ever returns true ("B")
        returns true if the block ever returns true ("C")
        returns true if the block ever returns true (nil)
        returns false if the block always returns false
      with no block
        returns true if any value is truthy
        returns false if all values are falsey

Immutable::List
  #append
    is lazy
    on [] and []
      preserves the left
      preserves the right
      returns []
    on ["A"] and []
      preserves the left
      preserves the right
      returns ["A"]
    on [] and ["A"]
      preserves the left
      preserves the right
      returns ["A"]
    on ["A", "B"] and ["C", "D"]
      preserves the left
      preserves the right
      returns ["A", "B", "C", "D"]
  #concat
    is lazy
    on [] and []
      preserves the left
      preserves the right
      returns []
    on ["A"] and []
      preserves the left
      preserves the right
      returns ["A"]
    on [] and ["A"]
      preserves the left
      preserves the right
      returns ["A"]
    on ["A", "B"] and ["C", "D"]
      preserves the left
      preserves the right
      returns ["A", "B", "C", "D"]
  #+
    is lazy
    on [] and []
      preserves the left
      preserves the right
      returns []
    on ["A"] and []
      preserves the left
      preserves the right
      returns ["A"]
    on [] and ["A"]
      preserves the left
      preserves the right
      returns ["A"]
    on ["A", "B"] and ["C", "D"]
      preserves the left
      preserves the right
      returns ["A", "B", "C", "D"]

Immutable::List
  #at
    on a really big list
      doesn't run out of stack
    [] with 10
      returns nil
    ["A"] with 10
      returns nil
    ["A", "B", "C"] with 0
      returns "A"
    ["A", "B", "C"] with 2
      returns "C"
    ["A", "B", "C"] with -1
      returns "C"
    ["A", "B", "C"] with -2
      returns "B"
    ["A", "B", "C"] with -4
      returns nil

Immutable::List
  #break
    is lazy
    on []
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the prefix
        correctly identifies the remainder
      without a block
        returns a frozen array with two items
        returns self as the prefix
        leaves the remainder empty
    on [1]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the prefix
        correctly identifies the remainder
      without a block
        returns a frozen array with two items
        returns self as the prefix
        leaves the remainder empty
    on [1, 2]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the prefix
        correctly identifies the remainder
      without a block
        returns a frozen array with two items
        returns self as the prefix
        leaves the remainder empty
    on [1, 2, 3]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the prefix
        correctly identifies the remainder
      without a block
        returns a frozen array with two items
        returns self as the prefix
        leaves the remainder empty
    on [1, 2, 3, 4]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the prefix
        correctly identifies the remainder
      without a block
        returns a frozen array with two items
        returns self as the prefix
        leaves the remainder empty
    on [2, 3, 4]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the prefix
        correctly identifies the remainder
      without a block
        returns a frozen array with two items
        returns self as the prefix
        leaves the remainder empty
    on [3, 4]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the prefix
        correctly identifies the remainder
      without a block
        returns a frozen array with two items
        returns self as the prefix
        leaves the remainder empty
    on [4]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the prefix
        correctly identifies the remainder
      without a block
        returns a frozen array with two items
        returns self as the prefix
        leaves the remainder empty

Immutable::List
  #car
    is responded to
    on []
      preserves the original
      returns nil
  #car
    is responded to
    on ["A"]
      preserves the original
      returns "A"
  #car
    is responded to
    on ["A", "B", "C"]
      preserves the original
      returns "A"
  #cadr
    is responded to
    on ["A", "B", "C"]
      preserves the original
      returns "B"
  #caddr
    is responded to
    on ["A", "B", "C"]
      preserves the original
      returns "C"
  #cadddr
    is responded to
    on ["A", "B", "C"]
      preserves the original
      returns nil
  #caddddr
    is responded to
    on ["A", "B", "C"]
      preserves the original
      returns nil
  #cdr
    is responded to
    on []
      preserves the original
      returns Immutable::List[]
  #cdr
    is responded to
    on ["A"]
      preserves the original
      returns Immutable::List[]
  #cdr
    is responded to
    on ["A", "B", "C"]
      preserves the original
      returns Immutable::List["B", "C"]
  #cddr
    is responded to
    on ["A", "B", "C"]
      preserves the original
      returns Immutable::List["C"]
  #cdddr
    is responded to
    on ["A", "B", "C"]
      preserves the original
      returns Immutable::List[]
  #cddddr
    is responded to
    on ["A", "B", "C"]
      preserves the original
      returns Immutable::List[]

Immutable::List
  #chunk
    is lazy
    on []
      preserves the original
      returns []
    on ["A"]
      preserves the original
      returns [Immutable::List["A"]]
    on ["A", "B", "C"]
      preserves the original
      returns [Immutable::List["A", "B"], Immutable::List["C"]]

Immutable::List
  #clear
    on []
      preserves the original
      returns an empty list
    on ["A"]
      preserves the original
      returns an empty list
    on ["A", "B", "C"]
      preserves the original
      returns an empty list

Immutable::List
  #combination
    is lazy
    on ["A", "B", "C", "D"] in groups of 1
      preserves the original
      returns [Immutable::List["A"], Immutable::List["B"], Immutable::List["C"], Immutable::List["D"]]
    on ["A", "B", "C", "D"] in groups of 2
      preserves the original
      returns [Immutable::List["A", "B"], Immutable::List["A", "C"], Immutable::List["A", "D"], Immutable::List["B", "C"], Immutable::List["B", "D"], Immutable::List["C", "D"]]
    on ["A", "B", "C", "D"] in groups of 3
      preserves the original
      returns [Immutable::List["A", "B", "C"], Immutable::List["A", "B", "D"], Immutable::List["A", "C", "D"], Immutable::List["B", "C", "D"]]
    on ["A", "B", "C", "D"] in groups of 4
      preserves the original
      returns [Immutable::List["A", "B", "C", "D"]]
    on ["A", "B", "C", "D"] in groups of 0
      preserves the original
      returns [Immutable::List[]]
    on ["A", "B", "C", "D"] in groups of 5
      preserves the original
      returns []
    on [] in groups of 0
      preserves the original
      returns [Immutable::List[]]
    on [] in groups of 1
      preserves the original
      returns []

Immutable::List
  #compact
    is lazy
    on []
      preserves the original
      returns []
    on ["A"]
      preserves the original
      returns ["A"]
    on ["A", "B", "C"]
      preserves the original
      returns ["A", "B", "C"]
    on [nil]
      preserves the original
      returns []
    on [nil, "B"]
      preserves the original
      returns ["B"]
    on ["A", nil]
      preserves the original
      returns ["A"]
    on [nil, nil]
      preserves the original
      returns []
    on ["A", nil, "C"]
      preserves the original
      returns ["A", "C"]
    on [nil, "B", nil]
      preserves the original
      returns ["B"]

Immutable::List
  #<=>
    with [] and [1]
      returns -1
    with [1] and []
      returns 1
    with [] and []
      returns 0
    with [1] and [2]
      returns -1
    with [2] and [1]
      returns 1
    with [1] and [1]
      returns 0
    with [1] and [1, 2]
      returns -1
    with [1, 2] and [1]
      returns 1
    with [1] and [1]
      returns 0
    with [2, 3, 4] and [3, 4, 5]
      returns -1
    with [3, 4, 5] and [2, 3, 4]
      returns 1
    with [2, 3, 4] and [2, 3, 4]
      returns 0

Immutable::List
  #cons
    on [] with "A"
      preserves the original
      returns ["A"]
    on ["A"] with "B"
      preserves the original
      returns ["B", "A"]
    on ["A"] with "A"
      preserves the original
      returns ["A", "A"]
    on ["A", "B", "C"] with "D"
      preserves the original
      returns ["D", "A", "B", "C"]

Immutable
  .list
    with no arguments
      always returns the same instance
      returns an empty list
    with a number of items
      always returns a different instance
      is the same as repeatedly using #cons
  .stream
    with no block
      returns an empty list
    with a block
      repeatedly calls the block
  .interval
    for numbers
      is equivalent to a list with explicit values
    for strings
      is equivalent to a list with explicit values
  .repeat
    returns an infinite list with specified value for each element
  .replicate
    returns a list with the specified value repeated the specified number of times
  .iterate
    returns an infinite list where the first item is calculated by applying the block on the initial argument, the second item by applying the function on the previous result and so on
  .enumerate
    returns a list based on the values yielded from the enumerator
    realizes values as they are needed
  []
    takes a variable number of items and returns a list
    returns an empty list when called without arguments

Immutable::List
  on []
    returns self
  on ["A"]
    returns self
  on ["A", "B", "C"]
    returns self
  on []
    returns self
  on ["A"]
    returns self
  on ["A", "B", "C"]
    returns self

Immutable::List
  #count
    on a really big list
      doesn't run out of stack
    on []
      with a block
        returns 0
      without a block
        returns length
    on [1]
      with a block
        returns 1
      without a block
        returns length
    on [1, 2]
      with a block
        returns 1
      without a block
        returns length
    on [1, 2, 3]
      with a block
        returns 2
      without a block
        returns length
    on [1, 2, 3, 4]
      with a block
        returns 2
      without a block
        returns length
    on [1, 2, 3, 4, 5]
      with a block
        returns 3
      without a block
        returns length

Immutable
  #cycle
    is lazy
    with an empty list
      returns an empty list
    with a non-empty list
      preserves the original
      infinitely cycles through all values

Immutable::List
  #delete_at
    removes the element at the specified index
    makes no modification if the index is out of range

Immutable::List
  #delete
    removes elements that are #== to the argument

Immutable::List
  #drop
    is lazy
    with 10 from []
      preserves the original
      returns []
    with 10 from ["A"]
      preserves the original
      returns []
    with -1 from ["A"]
      preserves the original
      returns ["A"]
    with 0 from ["A", "B", "C"]
      preserves the original
      returns ["A", "B", "C"]
    with 2 from ["A", "B", "C"]
      preserves the original
      returns ["C"]

Immutable::List
  #drop_while
    is lazy
    on []
      with a block
        preserves the original
        returns []
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        preserves the original
        returns []
      without a block
        returns an Enumerator
    on ["A", "B", "C"]
      with a block
        preserves the original
        returns ["C"]
      without a block
        returns an Enumerator

Immutable::List
  #each_chunk
    on a really big list
      doesn't run out of stack
    on []
      with a block
        preserves the original
        iterates over the items in order
        returns self
      without a block
        preserves the original
        returns an Enumerator
    on ["A"]
      with a block
        preserves the original
        iterates over the items in order
        returns self
      without a block
        preserves the original
        returns an Enumerator
    on ["A", "B", "C"]
      with a block
        preserves the original
        iterates over the items in order
        returns self
      without a block
        preserves the original
        returns an Enumerator
  #each_slice
    on a really big list
      doesn't run out of stack
    on []
      with a block
        preserves the original
        iterates over the items in order
        returns self
      without a block
        preserves the original
        returns an Enumerator
    on ["A"]
      with a block
        preserves the original
        iterates over the items in order
        returns self
      without a block
        preserves the original
        returns an Enumerator
    on ["A", "B", "C"]
      with a block
        preserves the original
        iterates over the items in order
        returns self
      without a block
        preserves the original
        returns an Enumerator

Immutable::List
  #each
    on a really big list
      doesn't run out of stack
    on []
      with a block
        iterates over the items in order
        returns nil
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        iterates over the items in order
        returns nil
      without a block
        returns an Enumerator
    on ["A", "B", "C"]
      with a block
        iterates over the items in order
        returns nil
      without a block
        returns an Enumerator

Immutable::List
  #each_with_index
    with no block
      returns an Enumerator
    with a block
      returns self
      iterates over the items in order, yielding item and index

Immutable::List
  #empty?
    on a really big list
      doesn't run out of stack
    on []
      returns true
    on ["A"]
      returns false
    on ["A", "B", "C"]
      returns false

Immutable::List
  Immutable::List["A", "B", "C"] should == ["A", "B", "C"]
  Immutable::List["A", "B", "C"] should not eql? ["A", "B", "C"]
  Immutable::List["A", "B", "C"] should not == #<Object:0xf564d340>
  Immutable::List["A", "B", "C"] should not eql? #<Object:0xf564cdf0>
  Immutable::List[] should == []
  Immutable::List[] should not eql? []
  Immutable::List[] should eql? Immutable::List[]
  Immutable::List[] should == Immutable::List[]
  Immutable::List[] should not eql? Immutable::List[nil]
  Immutable::List["A"] should not eql? Immutable::List[]
  Immutable::List["A"] should eql? Immutable::List["A"]
  Immutable::List["A"] should == Immutable::List["A"]
  Immutable::List["A"] should not eql? Immutable::List["B"]
  Immutable::List["A", "B"] should not eql? Immutable::List["A"]
  Immutable::List["A", "B", "C"] should eql? Immutable::List["A", "B", "C"]
  Immutable::List["A", "B", "C"] should == Immutable::List["A", "B", "C"]
  Immutable::List["C", "A", "B"] should not eql? Immutable::List["A", "B", "C"]
  Immutable::List["A"] should == ["A"]
  ["A"] should == Immutable::List["A"]
  Immutable::List["A"] should not eql? ["A"]
  ["A"] should not eql? Immutable::List["A"]
  #eql?
    on a really big list
      doesn't run out of stack

Immutable::List
  #fill
    can replace a range of items at the beginning of a list
    can replace a range of items in the middle of a list
    can replace a range of items at the end of a list
    can replace all the items in a list
    can fill past the end of the list
    is lazy
    with 1 argument
      replaces all the items in the list by default
    with 2 arguments
      replaces up to the end of the list by default
    when index and length are 0
      leaves the list unmodified

Immutable::List
  #find_all
    is lazy
    with an empty array
      with a block
        preserves the original
        returns the found list
      without a block
        returns an Enumerator
    with a single item array
      with a block
        preserves the original
        returns the found list
      without a block
        returns an Enumerator
    with a multi-item array
      with a block
        preserves the original
        returns the found list
      without a block
        returns an Enumerator
    with a multi-item single find_allable array
      with a block
        preserves the original
        returns the found list
      without a block
        returns an Enumerator
    with a multi-item multi-find_allable array
      with a block
        preserves the original
        returns the found list
      without a block
        returns an Enumerator

Immutable::List
  #find_index
    on a really big list
      doesn't run out of stack
    looking for "A" in []
      returns nil
    looking for nil in []
      returns nil
    looking for "A" in ["A"]
      returns 0
    looking for "B" in ["A"]
      returns nil
    looking for nil in ["A"]
      returns nil
    looking for "A" in ["A", "B", nil]
      returns 0
    looking for "B" in ["A", "B", nil]
      returns 1
    looking for nil in ["A", "B", nil]
      returns 2
    looking for "C" in ["A", "B", nil]
      returns nil
    looking for 2 in [2]
      returns 0
    looking for 2.0 in [2]
      returns 0
    looking for 2.0 in [2.0]
      returns 0
    looking for 2 in [2.0]
      returns 0
  #index
    on a really big list
      doesn't run out of stack
    looking for "A" in []
      returns nil
    looking for nil in []
      returns nil
    looking for "A" in ["A"]
      returns 0
    looking for "B" in ["A"]
      returns nil
    looking for nil in ["A"]
      returns nil
    looking for "A" in ["A", "B", nil]
      returns 0
    looking for "B" in ["A", "B", nil]
      returns 1
    looking for nil in ["A", "B", nil]
      returns 2
    looking for "C" in ["A", "B", nil]
      returns nil
    looking for 2 in [2]
      returns 0
    looking for 2.0 in [2]
      returns 0
    looking for 2.0 in [2.0]
      returns 0
    looking for 2 in [2.0]
      returns 0

Immutable::List
  #find
    on a really big list
      doesn't run out of stack
    on []
      with a block
        returns nil
      without a block
        returns an Enumerator
    on []
      with a block
        returns nil
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns "A"
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns nil
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns nil
      without a block
        returns an Enumerator
    on ["A", "B", nil]
      with a block
        returns "A"
      without a block
        returns an Enumerator
    on ["A", "B", nil]
      with a block
        returns "B"
      without a block
        returns an Enumerator
    on ["A", "B", nil]
      with a block
        returns nil
      without a block
        returns an Enumerator
    on ["A", "B", nil]
      with a block
        returns nil
      without a block
        returns an Enumerator
  #detect
    on a really big list
      doesn't run out of stack
    on []
      with a block
        returns nil
      without a block
        returns an Enumerator
    on []
      with a block
        returns nil
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns "A"
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns nil
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns nil
      without a block
        returns an Enumerator
    on ["A", "B", nil]
      with a block
        returns "A"
      without a block
        returns an Enumerator
    on ["A", "B", nil]
      with a block
        returns "B"
      without a block
        returns an Enumerator
    on ["A", "B", nil]
      with a block
        returns nil
      without a block
        returns an Enumerator
    on ["A", "B", nil]
      with a block
        returns nil
      without a block
        returns an Enumerator

Immutable::List
  #flat_map
    with an empty list
      returns the flattened values as a Immutable::List
      returns a Immutable::List
    with a block that returns an empty list
      returns the flattened values as a Immutable::List
      returns a Immutable::List
    with a list of one item
      returns the flattened values as a Immutable::List
      returns a Immutable::List
    with a list of multiple items
      returns the flattened values as a Immutable::List
      returns a Immutable::List

Immutable
  #flatten
    is lazy
    on []
      preserves the original
      returns an empty list
    on ["A"]
      preserves the original
      returns an empty list
    on ["A", "B", "C"]
      preserves the original
      returns an empty list
    on ["A", Immutable::List["B"], "C"]
      preserves the original
      returns an empty list
    on [Immutable::List["A"], Immutable::List["B"], Immutable::List["C"]]
      preserves the original
      returns an empty list

Immutable::List
  #grep
    is lazy
    without a block
      on []
        returns []
      on ["A"]
        returns ["A"]
      on [1]
        returns []
      on ["A", 2, "C"]
        returns ["A", "C"]
    with a block
      on []
        preserves the original
        returns []
      on ["A"]
        preserves the original
        returns ["a"]
      on [1]
        preserves the original
        returns []
      on ["A", 2, "C"]
        preserves the original
        returns ["a", "c"]

Immutable::List
  #group_by
    on a really big list
      doesn't run out of stack
    with a block
      on []
        returns []
      on [1]
        returns [{true=>Immutable::List[1]}]
      on [1, 2, 3, 4]
        returns [{true=>Immutable::List[3, 1], false=>Immutable::List[4, 2]}]
    without a block
      on []
        returns []
      on [1]
        returns [{1=>Immutable::List[1]}]
      on [1, 2, 3, 4]
        returns [{1=>Immutable::List[1], 2=>Immutable::List[2], 3=>Immutable::List[3], 4=>Immutable::List[4]}]
  #group
    on a really big list
      doesn't run out of stack
    with a block
      on []
        returns []
      on [1]
        returns [{true=>Immutable::List[1]}]
      on [1, 2, 3, 4]
        returns [{true=>Immutable::List[3, 1], false=>Immutable::List[4, 2]}]
    without a block
      on []
        returns []
      on [1]
        returns [{1=>Immutable::List[1]}]
      on [1, 2, 3, 4]
        returns [{1=>Immutable::List[1], 2=>Immutable::List[2], 3=>Immutable::List[3], 4=>Immutable::List[4]}]

Immutable::List
  #hash
    values are sufficiently distributed
    on a really big list
      doesn't run out of stack
    on an empty list
      returns 0

Immutable::List
  #head
    on []
      returns nil
    on ["A"]
      returns "A"
    on ["A", "B", "C"]
      returns "A"
  #first
    on []
      returns nil
    on ["A"]
      returns "A"
    on ["A", "B", "C"]
      returns "A"

Immutable::List
  #include?
    on a really big list
      doesn't run out of stack
    on []
      returns false
    on []
      returns false
    on ["A"]
      returns true
    on ["A"]
      returns false
    on ["A"]
      returns false
    on ["A", "B", nil]
      returns true
    on ["A", "B", nil]
      returns true
    on ["A", "B", nil]
      returns true
    on ["A", "B", nil]
      returns false
    on [2]
      returns true
    on [2]
      returns true
    on [2.0]
      returns true
    on [2.0]
      returns true
  #member?
    on a really big list
      doesn't run out of stack
    on []
      returns false
    on []
      returns false
    on ["A"]
      returns true
    on ["A"]
      returns false
    on ["A"]
      returns false
    on ["A", "B", nil]
      returns true
    on ["A", "B", nil]
      returns true
    on ["A", "B", nil]
      returns true
    on ["A", "B", nil]
      returns false
    on [2]
      returns true
    on [2]
      returns true
    on [2.0]
      returns true
    on [2.0]
      returns true

Immutable::List
  #index
    on a really big list
      doesn't run out of stack
    looking for "A" in []
      returns nil
    looking for nil in []
      returns nil
    looking for "A" in ["A"]
      returns 0
    looking for "B" in ["A"]
      returns nil
    looking for nil in ["A"]
      returns nil
    looking for "A" in ["A", "B", nil]
      returns 0
    looking for "B" in ["A", "B", nil]
      returns 1
    looking for nil in ["A", "B", nil]
      returns 2
    looking for "C" in ["A", "B", nil]
      returns nil
    looking for 2 in [2]
      returns 0
    looking for 2.0 in [2]
      returns 0
    looking for 2.0 in [2.0]
      returns 0
    looking for 2 in [2.0]
      returns 0

Immutable::List
  #indices
    when called with a block
      is lazy
      on a large list which doesn't contain desired item
        doesn't blow the stack
      looking for "A" in []
        returns []
      looking for "B" in ["A"]
        returns []
      looking for "B" in ["A", "B", "A"]
        returns [1]
      looking for "A" in ["A", "B", "A"]
        returns [0, 2]
      looking for 2 in [2]
        returns [0]
      looking for 2.0 in [2]
        returns [0]
      looking for 2.0 in [2.0]
        returns [0]
      looking for 2 in [2.0]
        returns [0]
    when called with a single argument
      is lazy
      looking for "A" in []
        returns []
      looking for "B" in ["A"]
        returns []
      looking for "B" in ["A", "B", "A"]
        returns [1]
      looking for "A" in ["A", "B", "A"]
        returns [0, 2]
      looking for 2 in [2]
        returns [0]
      looking for 2.0 in [2]
        returns [0]
      looking for 2.0 in [2.0]
        returns [0]
      looking for 2 in [2.0]
        returns [0]

Immutable::List
  #init
    is lazy
    on []
      preserves the original
      returns the list without the last element: []
    on ["A"]
      preserves the original
      returns the list without the last element: []
    on ["A", "B", "C"]
      preserves the original
      returns the list without the last element: ["A", "B"]

Immutable::List
  #inits
    is lazy
    on []
      preserves the original
      returns []
    on ["A"]
      preserves the original
      returns [Immutable::List["A"]]
    on ["A", "B", "C"]
      preserves the original
      returns [Immutable::List["A"], Immutable::List["A", "B"], Immutable::List["A", "B", "C"]]

Immutable::List
  #insert
    can add items at the beginning of a list
    can add items in the middle of a list
    can add items at the end of a list
    can add items past the end of a list
    accepts a negative index, which counts back from the end of the list
    raises IndexError if a negative index is too great
    is lazy

Immutable::List
  #inspect
    on a really big list
      doesn't run out of stack
    on []
      returns "Immutable::List[]"
      returns a string which can be eval'd to get an equivalent object
    on ["A"]
      returns "Immutable::List[\"A\"]"
      returns a string which can be eval'd to get an equivalent object
    on ["A", "B", "C"]
      returns "Immutable::List[\"A\", \"B\", \"C\"]"
      returns a string which can be eval'd to get an equivalent object

Immutable::List
  #intersperse
    is lazy
    on []
      preserves the original
      returns []
    on ["A"]
      preserves the original
      returns ["A"]
    on ["A", "B", "C"]
      preserves the original
      returns ["A", "|", "B", "|", "C"]

Immutable::List
  #join
    on a really big list
      doesn't run out of stack
    with a separator
      on []
        preserves the original
        returns ""
      on ["A"]
        preserves the original
        returns "A"
      on ["A", "B", "C"]
        preserves the original
        returns "A|B|C"
    without a separator
      on []
        preserves the original
        returns ""
      on ["A"]
        preserves the original
        returns "A"
      on ["A", "B", "C"]
        preserves the original
        returns "ABC"
    without a separator (with global default separator set)
      uses the default global separator

Immutable::List
  #last
    on a really big list
      doesn't run out of stack
    on []
      returns nil
    on ["A"]
      returns "A"
    on ["A", "B", "C"]
      returns "C"

Immutable::List
  #<<
    adds an item onto the end of a list
    on an empty list
      returns a list with one item

Immutable::List
  #map
    is lazy
    on []
      with a block
        preserves the original
        returns []
        is lazy
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        preserves the original
        returns ["a"]
        is lazy
      without a block
        returns an Enumerator
    on ["A", "B", "C"]
      with a block
        preserves the original
        returns ["a", "b", "c"]
        is lazy
      without a block
        returns an Enumerator
  #collect
    is lazy
    on []
      with a block
        preserves the original
        returns []
        is lazy
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        preserves the original
        returns ["a"]
        is lazy
      without a block
        returns an Enumerator
    on ["A", "B", "C"]
      with a block
        preserves the original
        returns ["a", "b", "c"]
        is lazy
      without a block
        returns an Enumerator

Immutable::List
  #max
    on a really big list
      doesn't run out of stack
    with a block
      on []
        returns nil
      on ["A"]
        returns "A"
      on ["Ichi", "Ni", "San"]
        returns "Ichi"
    without a block
      on []
        returns nil
      on ["A"]
        returns "A"
      on ["Ichi", "Ni", "San"]
        returns "San"

Immutable::List
  without a comparator
    on an empty list
      returns an empty list
    on a single list
      returns the list
    with multiple lists
      merges the lists based on natural sort order
  with a comparator
    on an empty list
      returns an empty list
    on a single list
      returns the list
    with multiple lists
      merges the lists based on the specified transformer

Immutable::List
  without a comparator
    on an empty list
      returns an empty list
    on a single list
      returns the list
    with multiple lists
      merges the lists based on natural sort order
  with a comparator
    on an empty list
      returns an empty list
    on a single list
      returns the list
    with multiple lists
      merges the lists based on the specified comparator

Immutable::List
  #min
    on a really big list
      doesn't run out of stack
    with a block
      on []
        returns nil
      on ["A"]
        returns "A"
      on ["Ichi", "Ni", "San"]
        returns "Ni"
    without a block
      on []
        returns nil
      on ["A"]
        returns "A"
      on ["Ichi", "Ni", "San"]
        returns "Ichi"

Immutable::List
  ensures each node of a lazy list will only be realized on ONE thread, even when accessed by multiple threads
  doesn't go into an infinite loop if lazy list block raises an exception
  doesn't give horrendously bad performance if thread realizing the list sleeps

Immutable::List
  #none?
    on a really big list
      doesn't run out of stack
    when empty
      with a block returns true
      with no block returns true
    when not empty
      with a block
        returns false if the block ever returns true ("A")
        returns false if the block ever returns true ("B")
        returns false if the block ever returns true ("C")
        returns false if the block ever returns true (nil)
        returns true if the block always returns false
      with no block
        returns false if any value is truthy
        returns true if all values are falsey

Immutable::List
  #one?
    on a really big list
      doesn't run out of stack
    when empty
      with a block returns false
      with no block returns false
    when not empty
      with a block
        returns false if the block returns true more than once
        returns false if the block never returns true
        returns true if the block only returns true once
      with no block
        returns false if more than one value is truthy
        returns true if only one value is truthy

Immutable::List
  #partition
    is lazy
    calls the passed block only once for each item
    returns a lazy list of items for which predicate is true
    returns a lazy list of items for which predicate is false
    calls the passed block only once for each item, even with multiple threads
    on []
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [1]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [1, 2]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [1, 2, 3]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [1, 2, 3, 4]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [2, 3, 4]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [3, 4]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [4]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator

Immutable::List
  #permutation
    with no block
      returns an Enumerator
    with no argument
      yields all permutations of the list
    with a length argument
      yields all N-size permutations of the list
    with a length argument greater than length of list
      yields nothing
    with a length argument of 0
      yields an empty list
    with a block
      returns the original list

Immutable::List
  #pop
    with an empty list
      returns an empty list
    with a list with a few items
      removes the last item

Immutable::List
  #product
    on a really big list
      doesn't run out of stack
    on []
      returns 1
    on [2]
      returns 2
    on [1, 3, 5, 7, 11]
      returns 1155

Immutable::List
  #reduce
    on a really big list
      doesn't run out of stack
    on []
      with an initial value of 10 and a block
        returns 10
    on [1]
      with an initial value of 10 and a block
        returns 9
    on [1, 2, 3]
      with an initial value of 10 and a block
        returns 4
    on []
      with no initial value and a block
        returns nil
    on [1]
      with no initial value and a block
        returns 1
    on [1, 2, 3]
      with no initial value and a block
        returns -4
    with no block and a symbol argument
      uses the symbol as the name of a method to reduce with
    with no block and a string argument
      uses the string as the name of a method to reduce with
  #inject
    on a really big list
      doesn't run out of stack
    on []
      with an initial value of 10 and a block
        returns 10
    on [1]
      with an initial value of 10 and a block
        returns 9
    on [1, 2, 3]
      with an initial value of 10 and a block
        returns 4
    on []
      with no initial value and a block
        returns nil
    on [1]
      with no initial value and a block
        returns 1
    on [1, 2, 3]
      with no initial value and a block
        returns -4
    with no block and a symbol argument
      uses the symbol as the name of a method to reduce with
    with no block and a string argument
      uses the string as the name of a method to reduce with

Immutable::List
  #reject
    is lazy
    on []
      with a block
        returns []
        is lazy
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns ["A"]
        is lazy
      without a block
        returns an Enumerator
    on ["A", "B", "C"]
      with a block
        returns ["A", "B", "C"]
        is lazy
      without a block
        returns an Enumerator
    on ["A", "b", "C"]
      with a block
        returns ["A", "C"]
        is lazy
      without a block
        returns an Enumerator
    on ["a", "b", "c"]
      with a block
        returns []
        is lazy
      without a block
        returns an Enumerator
  #delete_if
    is lazy
    on []
      with a block
        returns []
        is lazy
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns ["A"]
        is lazy
      without a block
        returns an Enumerator
    on ["A", "B", "C"]
      with a block
        returns ["A", "B", "C"]
        is lazy
      without a block
        returns an Enumerator
    on ["A", "b", "C"]
      with a block
        returns ["A", "C"]
        is lazy
      without a block
        returns an Enumerator
    on ["a", "b", "c"]
      with a block
        returns []
        is lazy
      without a block
        returns an Enumerator

Immutable::List
  #reverse
    is lazy
    on a really big list
      doesn't run out of stack
    on []
      preserves the original
      returns []
    on ["A"]
      preserves the original
      returns ["A"]
    on ["A", "B", "C"]
      preserves the original
      returns ["C", "B", "A"]

Immutable::List
  #rotate
    when passed no argument
      returns a new list with the first element moved to the end
    with an integral argument n
      returns a new list with the first (n % size) elements moved to the end
    with a non-numeric argument
      raises a TypeError
    with an argument of zero (or one evenly divisible by list length)
      it returns self

Immutable::List
  #sample
    returns a randomly chosen item

Immutable::List
  #select
    is lazy
    with an empty array
      with a block
        preserves the original
        returns the selected list
      without a block
        returns an Enumerator
    with a single item array
      with a block
        preserves the original
        returns the selected list
      without a block
        returns an Enumerator
    with a multi-item array
      with a block
        preserves the original
        returns the selected list
      without a block
        returns an Enumerator
    with a multi-item single selectable array
      with a block
        preserves the original
        returns the selected list
      without a block
        returns an Enumerator
    with a multi-item multi-selectable array
      with a block
        preserves the original
        returns the selected list
      without a block
        returns an Enumerator

Immutable::List
  #size
    on a really big list
      doesn't run out of stack
    on []
      returns 0
    on ["A"]
      returns 1
    on ["A", "B", "C"]
      returns 3
  #length
    on a really big list
      doesn't run out of stack
    on []
      returns 0
    on ["A"]
      returns 1
    on ["A", "B", "C"]
      returns 3

Immutable::List
  #slice
    when passed a positive integral index
      returns the element at that index
      leaves the original unchanged
    when passed a negative integral index
      returns the element which is number (index.abs) counting from the end of the list
    when passed a positive integral index and count
      returns 'count' elements starting from 'index'
      leaves the original unchanged
    when passed a negative integral index and count
      returns 'count' elements, starting from index which is number 'index.abs' counting from the end of the array
    when passed a Range
      returns the elements whose indexes are within the given Range
      leaves the original unchanged
  when passed a subclass of Range
    works the same as with a Range
  #[]
    when passed a positive integral index
      returns the element at that index
      leaves the original unchanged
    when passed a negative integral index
      returns the element which is number (index.abs) counting from the end of the list
    when passed a positive integral index and count
      returns 'count' elements starting from 'index'
      leaves the original unchanged
    when passed a negative integral index and count
      returns 'count' elements, starting from index which is number 'index.abs' counting from the end of the array
    when passed a Range
      returns the elements whose indexes are within the given Range
      leaves the original unchanged
  when passed a subclass of Range
    works the same as with a Range

Immutable::List
  #sort
    is lazy
    on []
      with a block
        preserves the original
        returns []
      without a block
        preserves the original
        returns []
    on ["A"]
      with a block
        preserves the original
        returns ["A"]
      without a block
        preserves the original
        returns ["A"]
    on ["Ichi", "Ni", "San"]
      with a block
        preserves the original
        returns ["Ni", "San", "Ichi"]
      without a block
        preserves the original
        returns ["Ichi", "Ni", "San"]
  #sort_by
    is lazy
    on []
      with a block
        preserves the original
        returns []
      without a block
        preserves the original
        returns []
    on ["A"]
      with a block
        preserves the original
        returns ["A"]
      without a block
        preserves the original
        returns ["A"]
    on ["Ichi", "Ni", "San"]
      with a block
        preserves the original
        returns ["Ni", "San", "Ichi"]
      without a block
        preserves the original
        returns ["Ichi", "Ni", "San"]

List#span
  is lazy
  given a predicate (in the form of a block), splits the list into two lists
  (returned as an array) such that elements in the first list (the prefix) are
  taken from the head of the list while the predicate is satisfied, and elements
  in the second list (the remainder) are the remaining elements from the list
  once the predicate is not satisfied. For example:
    given the list []
      and a predicate that returns true for values <= 2
        preserves the original
        returns the prefix as []
        returns the remainder as []
        calls the block only once for each element
      without a predicate
        returns a frozen array
        returns self as the prefix
        returns an empty list as the remainder
    given the list [1]
      and a predicate that returns true for values <= 2
        preserves the original
        returns the prefix as [1]
        returns the remainder as []
        calls the block only once for each element
      without a predicate
        returns a frozen array
        returns self as the prefix
        returns an empty list as the remainder
    given the list [1, 2]
      and a predicate that returns true for values <= 2
        preserves the original
        returns the prefix as [1, 2]
        returns the remainder as []
        calls the block only once for each element
      without a predicate
        returns a frozen array
        returns self as the prefix
        returns an empty list as the remainder
    given the list [1, 2, 3]
      and a predicate that returns true for values <= 2
        preserves the original
        returns the prefix as [1, 2]
        returns the remainder as [3]
        calls the block only once for each element
      without a predicate
        returns a frozen array
        returns self as the prefix
        returns an empty list as the remainder
    given the list [1, 2, 3, 4]
      and a predicate that returns true for values <= 2
        preserves the original
        returns the prefix as [1, 2]
        returns the remainder as [3, 4]
        calls the block only once for each element
      without a predicate
        returns a frozen array
        returns self as the prefix
        returns an empty list as the remainder
    given the list [2, 3, 4]
      and a predicate that returns true for values <= 2
        preserves the original
        returns the prefix as [2]
        returns the remainder as [3, 4]
        calls the block only once for each element
      without a predicate
        returns a frozen array
        returns self as the prefix
        returns an empty list as the remainder
    given the list [3, 4]
      and a predicate that returns true for values <= 2
        preserves the original
        returns the prefix as []
        returns the remainder as [3, 4]
        calls the block only once for each element
      without a predicate
        returns a frozen array
        returns self as the prefix
        returns an empty list as the remainder
    given the list [4]
      and a predicate that returns true for values <= 2
        preserves the original
        returns the prefix as []
        returns the remainder as [4]
        calls the block only once for each element
      without a predicate
        returns a frozen array
        returns self as the prefix
        returns an empty list as the remainder

Immutable::List
  #split_at
    is lazy
    on []
      preserves the original
      returns a frozen array with two items
      correctly identifies the matches
      correctly identifies the remainder
    on [1]
      preserves the original
      returns a frozen array with two items
      correctly identifies the matches
      correctly identifies the remainder
    on [1, 2]
      preserves the original
      returns a frozen array with two items
      correctly identifies the matches
      correctly identifies the remainder
    on [1, 2, 3]
      preserves the original
      returns a frozen array with two items
      correctly identifies the matches
      correctly identifies the remainder
    on [1, 2, 3, 4]
      preserves the original
      returns a frozen array with two items
      correctly identifies the matches
      correctly identifies the remainder

Immutable::List
  #subsequences
    yields all sublists with 1 or more consecutive items
    with no block
      returns an Enumerator

Immutable::List
  #sum
    on a really big list
      doesn't run out of stack
    on []
      returns 0
    on [2]
      returns 2
    on [1, 3, 5, 7, 11]
      returns 27

Immutable::List
  #tail
    on a really big list
      doesn't run out of stack
    on []
      preserves the original
      returns []
    on ["A"]
      preserves the original
      returns []
    on ["A", "B", "C"]
      preserves the original
      returns ["B", "C"]

Immutable::List
  #tails
    is lazy
    on []
      preserves the original
      returns []
    on ["A"]
      preserves the original
      returns [Immutable::List["A"]]
    on ["A", "B", "C"]
      preserves the original
      returns [Immutable::List["A", "B", "C"], Immutable::List["B", "C"], Immutable::List["C"]]

Immutable::List
  #take
    is lazy
    10 from []
      preserves the original
      returns []
    10 from ["A"]
      preserves the original
      returns ["A"]
    -1 from ["A"]
      preserves the original
      returns []
    0 from ["A", "B", "C"]
      preserves the original
      returns []
    2 from ["A", "B", "C"]
      preserves the original
      returns ["A", "B"]

Immutable::List
  #take_while
    is lazy
    on []
      with a block
        returns []
        preserves the original
        is lazy
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns ["A"]
        preserves the original
        is lazy
      without a block
        returns an Enumerator
    on ["A", "B", "C"]
      with a block
        returns ["A", "B"]
        preserves the original
        is lazy
      without a block
        returns an Enumerator

Immutable::List
  #to_a
    on a really big list
      doesn't run out of stack
    on []
      returns []
      leaves the original unchanged
      returns a mutable array
    on ["A"]
      returns ["A"]
      leaves the original unchanged
      returns a mutable array
    on ["A", "B", "C"]
      returns ["A", "B", "C"]
      leaves the original unchanged
      returns a mutable array
  #entries
    on a really big list
      doesn't run out of stack
    on []
      returns []
      leaves the original unchanged
      returns a mutable array
    on ["A"]
      returns ["A"]
      leaves the original unchanged
      returns a mutable array
    on ["A", "B", "C"]
      returns ["A", "B", "C"]
      leaves the original unchanged
      returns a mutable array

Immutable::List
  #to_ary
    on a really big list
      doesn't run out of stack
    enables implicit conversion to
      block parameters
      method arguments
      works with splat

Immutable::List
  #to_list
    on []
      returns self
    on ["A"]
      returns self
    on ["A", "B", "C"]
      returns self

Immutable::List
  #to_set
    on []
      returns a set with the same values
    on ["A"]
      returns a set with the same values
    on ["A", "B", "C"]
      returns a set with the same values

Immutable::List
  #transpose
    takes a list of lists and returns a list of all the first elements, all the 2nd elements, and so on
    only goes as far as the shortest list

Immutable::List
  #union
    is lazy
    returns []
      for [] and []
      for [] and []
    returns ["A"]
      for ["A"] and []
      for [] and ["A"]
    returns ["A", "B", "C"]
      for ["A", "B", "C"] and []
      for [] and ["A", "B", "C"]
    returns ["A"]
      for ["A", "A"] and ["A"]
      for ["A"] and ["A", "A"]
  #|
    is lazy
    returns []
      for [] and []
      for [] and []
    returns ["A"]
      for ["A"] and []
      for [] and ["A"]
    returns ["A", "B", "C"]
      for ["A", "B", "C"] and []
      for [] and ["A", "B", "C"]
    returns ["A"]
      for ["A", "A"] and ["A"]
      for ["A"] and ["A", "A"]

Immutable::List
  #uniq
    is lazy
    when passed a block
      uses the block to identify duplicates
    on []
      preserves the original
      returns []
    on ["A"]
      preserves the original
      returns ["A"]
    on ["A", "B", "C"]
      preserves the original
      returns ["A", "B", "C"]
    on ["A", "B", "A", "C", "C"]
      preserves the original
      returns ["A", "B", "C"]

Immutable::List
  #zip
    is lazy
    on [] and []
      returns []
    on ["A"] and ["aye"]
      returns [Immutable::List["A", "aye"]]
    on ["A"] and []
      returns [Immutable::List["A", nil]]
    on [] and ["A"]
      returns [Immutable::List[nil, "A"]]
    on ["A", "B", "C"] and ["aye", "bee", "see"]
      returns [Immutable::List["A", "aye"], Immutable::List["B", "bee"], Immutable::List["C", "see"]]

Immutable
  .from
    with {"a"=>1, "b"=>[2, {"c"=>3}, 4], "d"=>#<Set: {5, 6, 7}>, "e"=>{"f"=>8, "g"=>9}, "h"=>/ijk/} as input
      should return Immutable::Hash["e" => Immutable::Hash["f" => 8, "g" => 9], "d" => Immutable::Set[7, 5, 6], "b" => Immutable::Vector[2, Immutable::Hash["c" => 3], 4], "a" => 1, "h" => /ijk/]
    with {} as input
      should return Immutable::Hash[]
    with {"a"=>1, "b"=>2, "c"=>3} as input
      should return Immutable::Hash["b" => 2, "a" => 1, "c" => 3]
    with [] as input
      should return Immutable::Vector[]
    with [1, 2, 3] as input
      should return Immutable::Vector[1, 2, 3]
    with #<Set: {}> as input
      should return Immutable::Set[]
    with #<Set: {1, 2, 3}> as input
      should return Immutable::Set[3, 1, 2]
    with 42 as input
      should return 42
    with #<IO:<STDOUT>> as input
      should return #<IO:<STDOUT>>
    with #<struct Struct::Customer name=nil, address=nil> as input
      should return Immutable::Hash[:address => nil, :name => nil]
    with #<struct Struct::Customer name="Dave", address="123 Main"> as input
      should return Immutable::Hash[:address => "123 Main", :name => "Dave"]
    with mixed object
      should return Immutable data
  .to_ruby
    with Immutable::Hash["e" => Immutable::Hash["f" => 8, "g" => 9], "d" => Immutable::Set[7, 5, 6], "b" => Immutable::Vector[2, Immutable::Hash["c" => 3], 4], "a" => 1, "h" => /ijk/] as input
      should return {"a"=>1, "b"=>[2, {"c"=>3}, 4], "d"=>#<Set: {5, 6, 7}>, "e"=>{"f"=>8, "g"=>9}, "h"=>/ijk/}
    with Immutable::Hash[] as input
      should return {}
    with Immutable::Hash["b" => 2, "a" => 1, "c" => 3] as input
      should return {"a"=>1, "b"=>2, "c"=>3}
    with Immutable::Vector[] as input
      should return []
    with Immutable::Vector[1, 2, 3] as input
      should return [1, 2, 3]
    with Immutable::Set[] as input
      should return #<Set: {}>
    with Immutable::Set[3, 1, 2] as input
      should return #<Set: {1, 2, 3}>
    with 42 as input
      should return 42
    with #<IO:<STDOUT>> as input
      should return #<IO:<STDOUT>>
    with Immutable::Deque[] as input
      should return []
    with Immutable::Deque[Immutable::Hash["a" => 1]] as input
      should return [{"a" => 1}]
    with Immutable::SortedSet[] as input
      should return ::SortedSet.new
    with Immutable::SortedSet[1, 2, 3] as input
      should return ::SortedSet.new
    with mixed object
      should return Ruby data structures

Immutable::Set
  #add
    can add nil to a set
    works on large sets, with many combinations of input
    with a unique value
      preserves the original
      returns a copy with the superset of values
    with a duplicate value
      preserves the original values
      returns self
  #<<
    can add nil to a set
    works on large sets, with many combinations of input
    with a unique value
      preserves the original
      returns a copy with the superset of values
    with a duplicate value
      preserves the original values
      returns self
  #add?
    with a unique value
      preserves the original
      returns a copy with the superset of values
    with a duplicate value
      preserves the original values
      returns false

Immutable::Set
  #all?
    when empty
      with a block returns true
      with no block returns true
    when not empty
      with a block
        returns true if the block always returns true
        returns false if the block ever returns false
        propagates an exception from the block
        stops iterating as soon as the block returns false
      with no block
        returns true if all values are truthy
        returns false if any value is nil
        returns false if any value is false

Immutable::Set
  #any?
    when empty
      with a block returns false
      with no block returns false
    when not empty
      with a block
        returns true if the block ever returns true ("A")
        returns true if the block ever returns true ("B")
        returns true if the block ever returns true ("C")
        returns true if the block ever returns true (nil)
        returns false if the block always returns false
        propagates exceptions raised in the block
        stops iterating as soon as the block returns true
      with no block
        returns true if any value is truthy
        returns false if all values are falsey

Immutable::Set
  #clear
    on []
      preserves the original
      returns an empty set
    on ["A"]
      preserves the original
      returns an empty set
    on ["A", "B", "C"]
      preserves the original
      returns an empty set
    from a subclass
      returns an empty instance of the subclass

Immutable::Set
  #compact
    on []
      preserves the original
      returns []
    on ["A"]
      preserves the original
      returns ["A"]
    on ["A", "B", "C"]
      preserves the original
      returns ["A", "B", "C"]
    on [nil]
      preserves the original
      returns []
    on [nil, "B"]
      preserves the original
      returns ["B"]
    on ["A", nil]
      preserves the original
      returns ["A"]
    on [nil, nil]
      preserves the original
      returns []
    on ["A", nil, "C"]
      preserves the original
      returns ["A", "C"]
    on [nil, "B", nil]
      preserves the original
      returns ["B"]

Immutable::Set
  .set
    with no values
      returns the empty set
    with a list of values
      is equivalent to repeatedly using #add

Immutable::Set
  #dup
    returns self
  #clone
    returns self

Immutable::Set
  #count
    works on large sets
    on []
      with a block
        returns 0
      without a block
        returns length
    on [1]
      with a block
        returns 1
      without a block
        returns length
    on [1, 2]
      with a block
        returns 1
      without a block
        returns length
    on [1, 2, 3]
      with a block
        returns 2
      without a block
        returns length
    on [1, 2, 3, 4]
      with a block
        returns 2
      without a block
        returns length
    on [1, 2, 3, 4, 5]
      with a block
        returns 3
      without a block
        returns length

Immutable::Set
  #delete
    works on large sets, with many combinations of input
    with an existing value
      preserves the original
      returns a copy with the remaining values
    with a non-existing value
      preserves the original values
      returns self
    when removing the last value in a set
      returns the canonical empty set
  #delete?
    with an existing value
      preserves the original
      returns a copy with the remaining values
    with a non-existing value
      preserves the original values
      returns false

Immutable::Set
  #difference
    works on a wide variety of inputs
    for [] and []
      doesn't modify the original Sets
      returns []
    when passed a Ruby Array
      returns the expected Set
    for ["A"] and []
      doesn't modify the original Sets
      returns ["A"]
    when passed a Ruby Array
      returns the expected Set
    for ["A"] and ["A"]
      doesn't modify the original Sets
      returns []
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C"] and ["B"]
      doesn't modify the original Sets
      returns ["A", "C"]
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C"] and ["A", "C"]
      doesn't modify the original Sets
      returns ["B"]
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C", "D", "E", "F", "G", "H"] and []
      doesn't modify the original Sets
      returns ["A", "B", "C", "D", "E", "F", "G", "H"]
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C", "M", "X", "Y", "Z"] and ["B", "C", "D", "E", "F", "G", "H", "I", "J", "X"]
      doesn't modify the original Sets
      returns ["A", "M", "Y", "Z"]
    when passed a Ruby Array
      returns the expected Set
  #subtract
    works on a wide variety of inputs
    for [] and []
      doesn't modify the original Sets
      returns []
    when passed a Ruby Array
      returns the expected Set
    for ["A"] and []
      doesn't modify the original Sets
      returns ["A"]
    when passed a Ruby Array
      returns the expected Set
    for ["A"] and ["A"]
      doesn't modify the original Sets
      returns []
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C"] and ["B"]
      doesn't modify the original Sets
      returns ["A", "C"]
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C"] and ["A", "C"]
      doesn't modify the original Sets
      returns ["B"]
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C", "D", "E", "F", "G", "H"] and []
      doesn't modify the original Sets
      returns ["A", "B", "C", "D", "E", "F", "G", "H"]
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C", "M", "X", "Y", "Z"] and ["B", "C", "D", "E", "F", "G", "H", "I", "J", "X"]
      doesn't modify the original Sets
      returns ["A", "M", "Y", "Z"]
    when passed a Ruby Array
      returns the expected Set
  #-
    works on a wide variety of inputs
    for [] and []
      doesn't modify the original Sets
      returns []
    when passed a Ruby Array
      returns the expected Set
    for ["A"] and []
      doesn't modify the original Sets
      returns ["A"]
    when passed a Ruby Array
      returns the expected Set
    for ["A"] and ["A"]
      doesn't modify the original Sets
      returns []
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C"] and ["B"]
      doesn't modify the original Sets
      returns ["A", "C"]
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C"] and ["A", "C"]
      doesn't modify the original Sets
      returns ["B"]
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C", "D", "E", "F", "G", "H"] and []
      doesn't modify the original Sets
      returns ["A", "B", "C", "D", "E", "F", "G", "H"]
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C", "M", "X", "Y", "Z"] and ["B", "C", "D", "E", "F", "G", "H", "I", "J", "X"]
      doesn't modify the original Sets
      returns ["A", "M", "Y", "Z"]
    when passed a Ruby Array
      returns the expected Set

Immutable::Set
  #disjoint?
    for [] and []
      returns true
    for ["A"] and []
      returns true
    for [] and ["A"]
      returns true
    for ["A"] and ["A"]
      returns false
    for ["A", "B", "C"] and ["B"]
      returns false
    for ["B"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["D", "E"]
      returns true
    for ["F", "G", "H", "I"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "B", "C", "D"]
      returns false
    for ["D", "E", "F", "G"] and ["A", "B", "C"]
      returns true

Immutable::Set
  #each
    yields both of a pair of colliding keys
    without a block
      returns an Enumerator
    with an empty block
      returns self
    with a block
      yields all values

Immutable::Set
  #empty?
    on []
      returns true
    on ["A"]
      returns false
    on ["A", "B", "C"]
      returns false
    on [nil]
      returns false
    on [false]
      returns false
  .empty
    returns the canonical empty set
    from a subclass
      returns an empty instance of the subclass
      calls overridden #initialize when creating empty Set

Immutable::Set
  #==
    when comparing to a standard set
      returns false
    when comparing to a arbitrary object
      returns false
    with an empty set for each comparison
      returns true
    with an empty set and a set with nil
      returns false
    with a single item array and empty array
      returns false
    with matching single item array
      returns true
    with mismatching single item array
      returns false
    with a multi-item array and single item array
      returns false
    with matching multi-item array
      returns true
    with a mismatching multi-item array
      returns true

Immutable::Set
  #eql?
    when comparing to a standard set
      returns false
    when comparing to a arbitrary object
      returns false
    when comparing with a subclass of Immutable::Set
      returns false
    with an empty set for each comparison
      returns true
    with an empty set and a set with nil
      returns false
    with a single item array and empty array
      returns false
    with matching single item array
      returns true
    with mismatching single item array
      returns false
    with a multi-item array and single item array
      returns false
    with matching multi-item array
      returns true
    with a mismatching multi-item array
      returns true

Immutable::Set
  #exclusion
    works for a wide variety of inputs
    for [] and []
      doesn't modify the original Sets
      returns []
    when passed a Ruby Array
      returns the expected Set
    for ["A"] and []
      doesn't modify the original Sets
      returns ["A"]
    when passed a Ruby Array
      returns the expected Set
    for ["A"] and ["A"]
      doesn't modify the original Sets
      returns []
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C"] and ["B"]
      doesn't modify the original Sets
      returns ["A", "C"]
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C"] and ["B", "C", "D"]
      doesn't modify the original Sets
      returns ["A", "D"]
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C"] and ["D", "E", "F"]
      doesn't modify the original Sets
      returns ["A", "B", "C", "D", "E", "F"]
    when passed a Ruby Array
      returns the expected Set
  #^
    works for a wide variety of inputs
    for [] and []
      doesn't modify the original Sets
      returns []
    when passed a Ruby Array
      returns the expected Set
    for ["A"] and []
      doesn't modify the original Sets
      returns ["A"]
    when passed a Ruby Array
      returns the expected Set
    for ["A"] and ["A"]
      doesn't modify the original Sets
      returns []
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C"] and ["B"]
      doesn't modify the original Sets
      returns ["A", "C"]
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C"] and ["B", "C", "D"]
      doesn't modify the original Sets
      returns ["A", "D"]
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C"] and ["D", "E", "F"]
      doesn't modify the original Sets
      returns ["A", "B", "C", "D", "E", "F"]
    when passed a Ruby Array
      returns the expected Set

Immutable::Set
  #find
    on []
      with a block
        returns nil
      without a block
        returns an Enumerator
    on []
      with a block
        returns nil
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns "A"
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns nil
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns nil
      without a block
        returns an Enumerator
    on ["A", "B", nil]
      with a block
        returns "A"
      without a block
        returns an Enumerator
    on ["A", "B", nil]
      with a block
        returns "B"
      without a block
        returns an Enumerator
    on ["A", "B", nil]
      with a block
        returns nil
      without a block
        returns an Enumerator
    on ["A", "B", nil]
      with a block
        returns nil
      without a block
        returns an Enumerator
  #detect
    on []
      with a block
        returns nil
      without a block
        returns an Enumerator
    on []
      with a block
        returns nil
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns "A"
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns nil
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns nil
      without a block
        returns an Enumerator
    on ["A", "B", nil]
      with a block
        returns "A"
      without a block
        returns an Enumerator
    on ["A", "B", nil]
      with a block
        returns "B"
      without a block
        returns an Enumerator
    on ["A", "B", nil]
      with a block
        returns nil
      without a block
        returns an Enumerator
    on ["A", "B", nil]
      with a block
        returns nil
      without a block
        returns an Enumerator

Immutable::Set
  #first
    returns nil if only member of set is nil
    returns the first item yielded by #each
    on an empty set
      returns nil
    on a non-empty set
      returns an arbitrary value from the set

Immutable
  #flatten
    on ["A"]
      preserves the original
      returns the inlined values
    on ["A", "B", "C"]
      preserves the original
      returns the inlined values
    on ["A", Immutable::Set["B"], "C"]
      preserves the original
      returns the inlined values
    on [Immutable::Set["A"], Immutable::Set["B"], Immutable::Set["C"]]
      preserves the original
      returns the inlined values
    on an empty set
      returns an empty set
    on a set with multiple levels of nesting
      inlines lower levels of nesting
    from a subclass
      returns an instance of the subclass

Immutable::Set
  #grep
    without a block
      with an empty set
        returns the filtered values
      with a single item set
        returns the filtered values
      with a single item set that doesn't contain match
        returns the filtered values
      with a multi-item set where one isn't a match
        returns the filtered values
    with a block
      with an empty set
        returns the filtered values
      with a single item set
        returns the filtered values
      with a single item set that doesn't contain match
        returns the filtered values
      with a multi-item set where one isn't a match
        returns the filtered values

Immutable::Set
  #grep_v
    without a block
      with an empty set
        returns the filtered values
      with a single item set
        returns the filtered values
      with a single item set that doesn't contain match
        returns the filtered values
      with a multi-item set where one isn't a match
        returns the filtered values
    with a block
      resulting items are processed with the block
        returns the filtered values

Immutable::Set
  #group_by
    returns a hash without default proc
    with a block
      on []
        returns []
      on [1]
        returns [{true=>Immutable::Set[1]}]
      on [1, 2, 3, 4]
        returns [{true=>Immutable::Set[3, 1], false=>Immutable::Set[4, 2]}]
    without a block
      on []
        returns []
      on [1]
        returns [{1=>Immutable::Set[1]}]
      on [1, 2, 3, 4]
        returns [{1=>Immutable::Set[1], 2=>Immutable::Set[2], 3=>Immutable::Set[3], 4=>Immutable::Set[4]}]
    on an empty set
      returns an empty hash
    from a subclass
      returns an Hash whose values are instances of the subclass
  #group
    returns a hash without default proc
    with a block
      on []
        returns []
      on [1]
        returns [{true=>Immutable::Set[1]}]
      on [1, 2, 3, 4]
        returns [{true=>Immutable::Set[3, 1], false=>Immutable::Set[4, 2]}]
    without a block
      on []
        returns []
      on [1]
        returns [{1=>Immutable::Set[1]}]
      on [1, 2, 3, 4]
        returns [{1=>Immutable::Set[1], 2=>Immutable::Set[2], 3=>Immutable::Set[3], 4=>Immutable::Set[4]}]
    on an empty set
      returns an empty hash
    from a subclass
      returns an Hash whose values are instances of the subclass
  #classify
    returns a hash without default proc
    with a block
      on []
        returns []
      on [1]
        returns [{true=>Immutable::Set[1]}]
      on [1, 2, 3, 4]
        returns [{true=>Immutable::Set[3, 1], false=>Immutable::Set[4, 2]}]
    without a block
      on []
        returns []
      on [1]
        returns [{1=>Immutable::Set[1]}]
      on [1, 2, 3, 4]
        returns [{1=>Immutable::Set[1], 2=>Immutable::Set[2], 3=>Immutable::Set[3], 4=>Immutable::Set[4]}]
    on an empty set
      returns an empty hash
    from a subclass
      returns an Hash whose values are instances of the subclass

Immutable::Set
  #hash
    generates the same hash value for a set regardless of the order things were added to it
    values are sufficiently distributed
    on an empty set
      returns 0

Immutable::Set
  #include?
    returns true for an existing value ("A")
    returns true for an existing value ("B")
    returns true for an existing value ("C")
    returns true for an existing value (2.0)
    returns true for an existing value (nil)
    returns false for a non-existing value
    returns true even if existing value is nil
    returns true even if existing value is false
    returns false for a mutable item which is mutated after adding
    uses #eql? for equality
    returns the right answers after a lot of addings and removings
  #member?
    returns true for an existing value ("A")
    returns true for an existing value ("B")
    returns true for an existing value ("C")
    returns true for an existing value (2.0)
    returns true for an existing value (nil)
    returns false for a non-existing value
    returns true even if existing value is nil
    returns true even if existing value is false
    returns false for a mutable item which is mutated after adding
    uses #eql? for equality
    returns the right answers after a lot of addings and removings

Immutable::Set
  #inspect
    on []
      returns "Immutable::Set[]"
      returns a string which can be eval'd to get an equivalent set
    on ["A"]
      returns "Immutable::Set[\"A\"]"
      returns a string which can be eval'd to get an equivalent set
    on ["A", "B", "C"]
      returns a programmer-readable representation of the set contents
      returns a string which can be eval'd to get an equivalent set
    from a subclass
      returns a programmer-readable representation of the set contents
      returns a string which can be eval'd to get an equivalent set

Immutable::Set
  #intersect?
    for [] and []
      returns false
    for ["A"] and []
      returns false
    for [] and ["A"]
      returns false
    for ["A"] and ["A"]
      returns true
    for ["A", "B", "C"] and ["B"]
      returns true
    for ["B"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["D", "E"]
      returns false
    for ["F", "G", "H", "I"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "B", "C", "D"]
      returns true
    for ["D", "E", "F", "G"] and ["A", "B", "C"]
      returns false

Immutable::Set
  #intersection
    returns results consistent with Array#&
    for [] and []
      returns [], without changing the original Sets
    for [] and []
      returns [], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    for ["A"] and []
      returns [], without changing the original Sets
    for [] and ["A"]
      returns [], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    for ["A"] and ["A"]
      returns ["A"], without changing the original Sets
    for ["A"] and ["A"]
      returns ["A"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C"] and ["B"]
      returns ["B"], without changing the original Sets
    for ["B"] and ["A", "B", "C"]
      returns ["B"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C"] and ["A", "C"]
      returns ["A", "C"], without changing the original Sets
    for ["A", "C"] and ["A", "B", "C"]
      returns ["A", "C"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
  #&
    returns results consistent with Array#&
    for [] and []
      returns [], without changing the original Sets
    for [] and []
      returns [], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    for ["A"] and []
      returns [], without changing the original Sets
    for [] and ["A"]
      returns [], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    for ["A"] and ["A"]
      returns ["A"], without changing the original Sets
    for ["A"] and ["A"]
      returns ["A"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C"] and ["B"]
      returns ["B"], without changing the original Sets
    for ["B"] and ["A", "B", "C"]
      returns ["B"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    for ["A", "B", "C"] and ["A", "C"]
      returns ["A", "C"], without changing the original Sets
    for ["A", "C"] and ["A", "B", "C"]
      returns ["A", "C"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set

Immutable::Set
  #join
    with a separator
      on []
        preserves the original
        returns ""
      on ["A"]
        preserves the original
        returns "A"
      on ["A", "B", "C"]
        preserves the original
        returns "A|B|C"
    without a separator
      on []
        preserves the original
        returns ""
      on ["A"]
        preserves the original
        returns "A"
      on ["A", "B", "C"]
        preserves the original
        returns "ABC"
    without a separator (with global default separator set)
      on ['A', 'B', 'C']
        preserves the original
        returns nil

Immutable::Set
  #map
    works on large sets
    when empty
      returns self
    when not empty
      with a block
        preserves the original values
        returns a new set with the mapped values
      with no block
        returns an Enumerator
    from a subclass
      returns an instance of the subclass
    when multiple items map to the same value
      filters out the duplicates
  #collect
    works on large sets
    when empty
      returns self
    when not empty
      with a block
        preserves the original values
        returns a new set with the mapped values
      with no block
        returns an Enumerator
    from a subclass
      returns an instance of the subclass
    when multiple items map to the same value
      filters out the duplicates

Immutable::Set
  #marshal_dump/#marshal_load
    can survive dumping and loading into a new process
    is still possible to test items by key after loading

Immutable::Set
  #max
    with a block
      on []
        returns nil
      on ["A"]
        returns "A"
      on ["Ichi", "Ni", "San"]
        returns "Ichi"
    without a block
      on []
        returns nil
      on ["A"]
        returns "A"
      on ["Ichi", "Ni", "San"]
        returns "San"

Immutable::Set
  #min
    with a block
      on []
        returns nil
      on ["A"]
        returns "A"
      on ["Ichi", "Ni", "San"]
        returns "Ni"
    without a block
      on []
        returns nil
      on ["A"]
        returns "A"
      on ["Ichi", "Ni", "San"]
        returns "Ichi"

Immutable::Set
  .new
    initializes a new set
    accepts a Range
    returns a Set which doesn't change even if the initializer is mutated
    is amenable to overriding of #initialize
    from a subclass
      returns a frozen instance of the subclass
  []
    accepts any number of arguments and initializes a new set

Immutable::Set
  #none?
    when empty
      with a block returns true
      with no block returns true
    when not empty
      with a block
        returns false if the block ever returns true ("A")
        returns false if the block ever returns true ("B")
        returns false if the block ever returns true ("C")
        returns false if the block ever returns true (nil)
        returns true if the block always returns false
        stops iterating as soon as the block returns true
      with no block
        returns false if any value is truthy
        returns true if all values are falsey

Immutable::Set
  #one?
    when empty
      with a block returns false
      with no block returns false
    when not empty
      with a block
        returns false if the block returns true more than once
        returns false if the block never returns true
        returns true if the block only returns true once
      with no block
        returns false if more than one value is truthy
        returns true if only one value is truthy
        returns false if no values are truthy

Immutable::Set
  #partition
    on []
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [1]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [1, 2]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [1, 2, 3]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [1, 2, 3, 4]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [2, 3, 4]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [3, 4]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [4]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator

Immutable::Set
  #product
    on []
      returns 1
      doesn't change the original Set
    on [2]
      returns 2
      doesn't change the original Set
    on [1, 3, 5, 7, 11]
      returns 1155
      doesn't change the original Set

Immutable::Set
  #reduce
    on []
      with an initial value of 10
        and a block
          returns 10
    on [1]
      with an initial value of 10
        and a block
          returns 9
    on [1, 2, 3]
      with an initial value of 10
        and a block
          returns 4
    on []
      with no initial value
        and a block
          returns nil
    on [1]
      with no initial value
        and a block
          returns 1
    on [1, 2, 3]
      with no initial value
        and a block
          returns 6
    with no block and a symbol argument
      uses the symbol as the name of a method to reduce with
    with no block and a string argument
      uses the string as the name of a method to reduce with
  #inject
    on []
      with an initial value of 10
        and a block
          returns 10
    on [1]
      with an initial value of 10
        and a block
          returns 9
    on [1, 2, 3]
      with an initial value of 10
        and a block
          returns 4
    on []
      with no initial value
        and a block
          returns nil
    on [1]
      with no initial value
        and a block
          returns 1
    on [1, 2, 3]
      with no initial value
        and a block
          returns 6
    with no block and a symbol argument
      uses the symbol as the name of a method to reduce with
    with no block and a string argument
      uses the string as the name of a method to reduce with

Immutable::Set
  #reject
    when nothing matches
      returns self
    when only some things match
      with a block
        preserves the original
        returns a set with the matching values
      with no block
        returns self
    on a large set, with many combinations of input
      still works
  #delete_if
    when nothing matches
      returns self
    when only some things match
      with a block
        preserves the original
        returns a set with the matching values
      with no block
        returns self
    on a large set, with many combinations of input
      still works

Immutable::Set
  #reverse_each
    without a block
      returns an Enumerator
    with an empty block
      returns self
    with a block
      yields all values

Immutable::Set
  #sample
    returns a randomly chosen item

Immutable::Set
  #select
    works on a large set, with many combinations of input
    when everything matches
      returns self
    when only some things match
      with a block
        preserves the original
        returns a set with the matching values
      with no block
        returns an Enumerator
    when nothing matches
      preserves the original
      returns the canonical empty set
    from a subclass
      returns an instance of the same class
  #find_all
    works on a large set, with many combinations of input
    when everything matches
      returns self
    when only some things match
      with a block
        preserves the original
        returns a set with the matching values
      with no block
        returns an Enumerator
    when nothing matches
      preserves the original
      returns the canonical empty set
    from a subclass
      returns an instance of the same class

Immutable::Set
  #size
    returns 0 for []
    returns 1 for ["A"]
    returns 3 for ["A", "B", "C"]
  #length
    returns 0 for []
    returns 1 for ["A"]
    returns 3 for ["A", "B", "C"]

Immutable::Set
  #sort
    on []
      with a block
        returns []
        doesn't change the original Set
      without a block
        returns []
        doesn't change the original Set
    on ["A"]
      with a block
        returns ["A"]
        doesn't change the original Set
      without a block
        returns ["A"]
        doesn't change the original Set
    on ["Ichi", "Ni", "San"]
      with a block
        returns ["Ni", "San", "Ichi"]
        doesn't change the original Set
      without a block
        returns ["Ichi", "Ni", "San"]
        doesn't change the original Set
  #sort_by
    on []
      with a block
        returns []
        doesn't change the original Set
      without a block
        returns []
        doesn't change the original Set
    on ["A"]
      with a block
        returns ["A"]
        doesn't change the original Set
      without a block
        returns ["A"]
        doesn't change the original Set
    on ["Ichi", "Ni", "San"]
      with a block
        returns ["Ni", "San", "Ichi"]
        doesn't change the original Set
      without a block
        returns ["Ichi", "Ni", "San"]
        doesn't change the original Set
  #sort_by
    calls the passed block no more than twice for each item

Immutable::Set
  #subset?
    for [] and []
      returns true
    for ["A"] and []
      returns false
    for [] and ["A"]
      returns true
    for ["A"] and ["A"]
      returns true
    for ["A", "B", "C"] and ["B"]
      returns false
    for ["B"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "C"]
      returns false
    for ["A", "C"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "B", "C", "D"]
      returns true
    for ["A", "B", "C", "D"] and ["A", "B", "C"]
      returns false
  #<=
    for [] and []
      returns true
    for ["A"] and []
      returns false
    for [] and ["A"]
      returns true
    for ["A"] and ["A"]
      returns true
    for ["A", "B", "C"] and ["B"]
      returns false
    for ["B"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "C"]
      returns false
    for ["A", "C"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "B", "C", "D"]
      returns true
    for ["A", "B", "C", "D"] and ["A", "B", "C"]
      returns false
  #proper_subset?
    for [] and []
      returns false
    for ["A"] and []
      returns false
    for [] and ["A"]
      returns true
    for ["A"] and ["A"]
      returns false
    for ["A", "B", "C"] and ["B"]
      returns false
    for ["B"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "C"]
      returns false
    for ["A", "C"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "B", "C", "D"]
      returns true
    for ["A", "B", "C", "D"] and ["A", "B", "C"]
      returns false
  #<
    for [] and []
      returns false
    for ["A"] and []
      returns false
    for [] and ["A"]
      returns true
    for ["A"] and ["A"]
      returns false
    for ["A", "B", "C"] and ["B"]
      returns false
    for ["B"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "C"]
      returns false
    for ["A", "C"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "B", "C", "D"]
      returns true
    for ["A", "B", "C", "D"] and ["A", "B", "C"]
      returns false

Immutable::Set
  #sum
    on []
      returns 0
      doesn't change the original Set
    on [2]
      returns 2
      doesn't change the original Set
    on [1, 3, 5, 7, 11]
      returns 27
      doesn't change the original Set

Immutable::Set
  #superset?
    for [] and []
      returns true
    for ["A"] and []
      returns true
    for [] and ["A"]
      returns false
    for ["A"] and ["A"]
      returns true
    for ["A", "B", "C"] and ["B"]
      returns true
    for ["B"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "C"]
      returns true
    for ["A", "C"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "B", "C", "D"]
      returns false
    for ["A", "B", "C", "D"] and ["A", "B", "C"]
      returns true
  #>=
    for [] and []
      returns true
    for ["A"] and []
      returns true
    for [] and ["A"]
      returns false
    for ["A"] and ["A"]
      returns true
    for ["A", "B", "C"] and ["B"]
      returns true
    for ["B"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "C"]
      returns true
    for ["A", "C"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "B", "C", "D"]
      returns false
    for ["A", "B", "C", "D"] and ["A", "B", "C"]
      returns true
  #proper_superset?
    for [] and []
      returns false
    for ["A"] and []
      returns true
    for [] and ["A"]
      returns false
    for ["A"] and ["A"]
      returns false
    for ["A", "B", "C"] and ["B"]
      returns true
    for ["B"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "C"]
      returns true
    for ["A", "C"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "B", "C", "D"]
      returns false
    for ["A", "B", "C", "D"] and ["A", "B", "C"]
      returns true
  #>
    for [] and []
      returns false
    for ["A"] and []
      returns true
    for [] and ["A"]
      returns false
    for ["A"] and ["A"]
      returns false
    for ["A", "B", "C"] and ["B"]
      returns true
    for ["B"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "C"]
      returns true
    for ["A", "C"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "B", "C", "D"]
      returns false
    for ["A", "B", "C", "D"] and ["A", "B", "C"]
      returns true

Immutable::Set
  #to_a
    on 'a'..'a'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'b'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'c'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'d'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'e'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'f'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'g'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'h'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'i'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'j'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'k'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'l'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'m'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'n'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'o'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'p'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'q'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'r'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'s'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'t'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'u'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'v'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'w'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'x'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'y'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'z'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
  #entries
    on 'a'..'a'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'b'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'c'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'d'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'e'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'f'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'g'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'h'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'i'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'j'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'k'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'l'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'m'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'n'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'o'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'p'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'q'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'r'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'s'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'t'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'u'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'v'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'w'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'x'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'y'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array
    on 'a'..'z'
      returns an equivalent array
      doesn't change the original Set
      returns a mutable array

Immutable::Set
  #to_list
    on []
      returns a list
      doesn't change the original Set
      the returned list
        has the correct length
        contains all values
    on ["A"]
      returns a list
      doesn't change the original Set
      the returned list
        has the correct length
        contains all values
    on ["A", "B", "C"]
      returns a list
      doesn't change the original Set
      the returned list
        has the correct length
        contains all values

Immutable::Set
  #to_set
    on []
      returns self
    on ["A"]
      returns self
    on ["A", "B", "C"]
      returns self

Immutable::Set
  #union
    for [] and []
      returns [], without changing the original Sets
    for [] and []
      returns [], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A"] and []
      returns ["A"], without changing the original Sets
    for [] and ["A"]
      returns ["A"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A"] and ["A"]
      returns ["A"], without changing the original Sets
    for ["A"] and ["A"]
      returns ["A"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for [] and ["A"]
      returns ["A"], without changing the original Sets
    for ["A"] and []
      returns ["A"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A", "B", "C"] and []
      returns ["A", "B", "C"], without changing the original Sets
    for [] and ["A", "B", "C"]
      returns ["A", "B", "C"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns ["A", "B", "C"], without changing the original Sets
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns ["A", "B", "C"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A", "B", "C"] and ["X", "Y", "Z"]
      returns ["A", "B", "C", "X", "Y", "Z"], without changing the original Sets
    for ["X", "Y", "Z"] and ["A", "B", "C"]
      returns ["A", "B", "C", "X", "Y", "Z"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    when receiving a subset
      returns self
  #|
    for [] and []
      returns [], without changing the original Sets
    for [] and []
      returns [], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A"] and []
      returns ["A"], without changing the original Sets
    for [] and ["A"]
      returns ["A"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A"] and ["A"]
      returns ["A"], without changing the original Sets
    for ["A"] and ["A"]
      returns ["A"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for [] and ["A"]
      returns ["A"], without changing the original Sets
    for ["A"] and []
      returns ["A"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A", "B", "C"] and []
      returns ["A", "B", "C"], without changing the original Sets
    for [] and ["A", "B", "C"]
      returns ["A", "B", "C"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns ["A", "B", "C"], without changing the original Sets
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns ["A", "B", "C"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A", "B", "C"] and ["X", "Y", "Z"]
      returns ["A", "B", "C", "X", "Y", "Z"], without changing the original Sets
    for ["X", "Y", "Z"] and ["A", "B", "C"]
      returns ["A", "B", "C", "X", "Y", "Z"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    when receiving a subset
      returns self
  #+
    for [] and []
      returns [], without changing the original Sets
    for [] and []
      returns [], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A"] and []
      returns ["A"], without changing the original Sets
    for [] and ["A"]
      returns ["A"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A"] and ["A"]
      returns ["A"], without changing the original Sets
    for ["A"] and ["A"]
      returns ["A"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for [] and ["A"]
      returns ["A"], without changing the original Sets
    for ["A"] and []
      returns ["A"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A", "B", "C"] and []
      returns ["A", "B", "C"], without changing the original Sets
    for [] and ["A", "B", "C"]
      returns ["A", "B", "C"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns ["A", "B", "C"], without changing the original Sets
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns ["A", "B", "C"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A", "B", "C"] and ["X", "Y", "Z"]
      returns ["A", "B", "C", "X", "Y", "Z"], without changing the original Sets
    for ["X", "Y", "Z"] and ["A", "B", "C"]
      returns ["A", "B", "C", "X", "Y", "Z"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    when receiving a subset
      returns self
  #merge
    for [] and []
      returns [], without changing the original Sets
    for [] and []
      returns [], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A"] and []
      returns ["A"], without changing the original Sets
    for [] and ["A"]
      returns ["A"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A"] and ["A"]
      returns ["A"], without changing the original Sets
    for ["A"] and ["A"]
      returns ["A"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for [] and ["A"]
      returns ["A"], without changing the original Sets
    for ["A"] and []
      returns ["A"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A", "B", "C"] and []
      returns ["A", "B", "C"], without changing the original Sets
    for [] and ["A", "B", "C"]
      returns ["A", "B", "C"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns ["A", "B", "C"], without changing the original Sets
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns ["A", "B", "C"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    for ["A", "B", "C"] and ["X", "Y", "Z"]
      returns ["A", "B", "C", "X", "Y", "Z"], without changing the original Sets
    for ["X", "Y", "Z"] and ["A", "B", "C"]
      returns ["A", "B", "C", "X", "Y", "Z"], without changing the original Sets
    when passed a Ruby Array
      returns the expected Set
    from a subclass
      returns an instance of the subclass
    when receiving a subset
      returns self

Immutable::SortedSet
  #above
    when called without a block
      returns a sorted set of all items higher than the argument
    when called with a block
      yields all the items higher than the argument
    on an empty set
      returns an empty set
    with an argument higher than all the values in the set
      returns an empty set

Immutable::SortedSet
  #add
    with a unique value
      preserves the original
      returns a copy with the superset of values (in order)
    with a duplicate value
      preserves the original values
      returns self
    on a set ordered by a comparator
      inserts the new item in the correct place
  #<<
    with a unique value
      preserves the original
      returns a copy with the superset of values (in order)
    with a duplicate value
      preserves the original values
      returns self
    on a set ordered by a comparator
      inserts the new item in the correct place
  #add?
    with a unique value
      preserves the original
      returns a copy with the superset of values
    with a duplicate value
      preserves the original values
      returns false

Immutable::SortedSet
  #at
    [] with 10
      returns nil
    ["A"] with 10
      returns nil
    ["A", "B", "C"] with 0
      returns "A"
    ["A", "B", "C"] with 1
      returns "B"
    ["A", "B", "C"] with 2
      returns "C"
    ["A", "B", "C"] with 3
      returns nil
    ["A", "B", "C"] with -1
      returns "C"
    ["A", "B", "C"] with -2
      returns "B"
    ["A", "B", "C"] with -3
      returns "A"
    ["A", "B", "C"] with -4
      returns nil

Immutable::SortedSet
  #below
    when called without a block
      returns a sorted set of all items lower than the argument
    when called with a block
      yields all the items lower than the argument
    on an empty set
      returns an empty set
    with an argument lower than all the values in the set
      returns an empty set

Immutable::SortedSet
  #between
    when called without a block
      returns a sorted set of all items from the first argument to the second
    when called with a block
      yields all the items lower than the argument
    on an empty set
      returns an empty set
    with a 'to' argument lower than the 'from' argument
      returns an empty set

Immutable::SortedSet
  #clear
    on []
      preserves the original
      returns an empty set
    on ["A"]
      preserves the original
      returns an empty set
    on ["A", "B", "C"]
      preserves the original
      returns an empty set
    from a subclass
      returns an empty instance of the subclass
    with a comparator
      returns an empty instance with same comparator

Immutable::SortedSet
  on []
    returns self
  on ["A"]
    returns self
  on ["A", "B", "C"]
    returns self
  on 1..32
    returns self
  on []
    returns self
  on ["A"]
    returns self
  on ["A", "B", "C"]
    returns self
  on 1..32
    returns self

Immutable::SortedSet
  #delete_at
    removes the element at the specified index
    makes no modification if the index is out of range

Immutable::SortedSet
  #delete
    on an empty set
      returns an empty set
    with an existing value
      preserves the original
      returns a copy with the remaining of values
    with a non-existing value
      preserves the original values
      returns self
    when removing the last value in a sorted set
      maintains the set order
      when the set is in natural order
        returns the canonical empty set
    on [1, 2, 3], when deleting [1, 2, 3]
      returns []
    on [1, 2, 3, 4], when deleting [1, 2, 3]
      returns [4]
    on [1, 2, 3, 4], when deleting [1, 2, 4]
      returns [3]
    on [1, 2, 3, 4], when deleting [1, 3, 4]
      returns [2]
    on [1, 2, 3, 4], when deleting [2, 3, 4]
      returns [1]
    on [1, 2, 3, 4, 5], when deleting [1, 2, 3]
      returns [4, 5]
    on [1, 2, 3, 4, 5], when deleting [1, 2, 4]
      returns [3, 5]
    on [1, 2, 3, 4, 5], when deleting [1, 2, 5]
      returns [3, 4]
    on [1, 2, 3, 4, 5], when deleting [1, 3, 4]
      returns [2, 5]
    on [1, 2, 3, 4, 5], when deleting [1, 3, 5]
      returns [2, 4]
    on [1, 2, 3, 4, 5], when deleting [1, 4, 5]
      returns [2, 3]
    on [1, 2, 3, 4, 5], when deleting [2, 3, 4]
      returns [1, 5]
    on [1, 2, 3, 4, 5], when deleting [2, 3, 5]
      returns [1, 4]
    on [1, 2, 3, 4, 5], when deleting [2, 4, 5]
      returns [1, 3]
    on [1, 2, 3, 4, 5], when deleting [3, 4, 5]
      returns [1, 2]
    on [1, 2, 3, 4, 5, 6], when deleting [1, 2, 3]
      returns [4, 5, 6]
    on [1, 2, 3, 4, 5, 6], when deleting [1, 2, 4]
      returns [3, 5, 6]
    on [1, 2, 3, 4, 5, 6], when deleting [1, 2, 5]
      returns [3, 4, 6]
    on [1, 2, 3, 4, 5, 6], when deleting [1, 2, 6]
      returns [3, 4, 5]
    on [1, 2, 3, 4, 5, 6], when deleting [1, 3, 4]
      returns [2, 5, 6]
    on [1, 2, 3, 4, 5, 6], when deleting [1, 3, 5]
      returns [2, 4, 6]
    on [1, 2, 3, 4, 5, 6], when deleting [1, 3, 6]
      returns [2, 4, 5]
    on [1, 2, 3, 4, 5, 6], when deleting [1, 4, 5]
      returns [2, 3, 6]
    on [1, 2, 3, 4, 5, 6], when deleting [1, 4, 6]
      returns [2, 3, 5]
    on [1, 2, 3, 4, 5, 6], when deleting [1, 5, 6]
      returns [2, 3, 4]
    on [1, 2, 3, 4, 5, 6], when deleting [2, 3, 4]
      returns [1, 5, 6]
    on [1, 2, 3, 4, 5, 6], when deleting [2, 3, 5]
      returns [1, 4, 6]
    on [1, 2, 3, 4, 5, 6], when deleting [2, 3, 6]
      returns [1, 4, 5]
    on [1, 2, 3, 4, 5, 6], when deleting [2, 4, 5]
      returns [1, 3, 6]
    on [1, 2, 3, 4, 5, 6], when deleting [2, 4, 6]
      returns [1, 3, 5]
    on [1, 2, 3, 4, 5, 6], when deleting [2, 5, 6]
      returns [1, 3, 4]
    on [1, 2, 3, 4, 5, 6], when deleting [3, 4, 5]
      returns [1, 2, 6]
    on [1, 2, 3, 4, 5, 6], when deleting [3, 4, 6]
      returns [1, 2, 5]
    on [1, 2, 3, 4, 5, 6], when deleting [3, 5, 6]
      returns [1, 2, 4]
    on [1, 2, 3, 4, 5, 6], when deleting [4, 5, 6]
      returns [1, 2, 3]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [1, 2, 3]
      returns [4, 5, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [1, 2, 4]
      returns [3, 5, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [1, 2, 5]
      returns [3, 4, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [1, 2, 6]
      returns [3, 4, 5, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [1, 2, 7]
      returns [3, 4, 5, 6]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [1, 3, 4]
      returns [2, 5, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [1, 3, 5]
      returns [2, 4, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [1, 3, 6]
      returns [2, 4, 5, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [1, 3, 7]
      returns [2, 4, 5, 6]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [1, 4, 5]
      returns [2, 3, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [1, 4, 6]
      returns [2, 3, 5, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [1, 4, 7]
      returns [2, 3, 5, 6]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [1, 5, 6]
      returns [2, 3, 4, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [1, 5, 7]
      returns [2, 3, 4, 6]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [1, 6, 7]
      returns [2, 3, 4, 5]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [2, 3, 4]
      returns [1, 5, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [2, 3, 5]
      returns [1, 4, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [2, 3, 6]
      returns [1, 4, 5, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [2, 3, 7]
      returns [1, 4, 5, 6]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [2, 4, 5]
      returns [1, 3, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [2, 4, 6]
      returns [1, 3, 5, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [2, 4, 7]
      returns [1, 3, 5, 6]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [2, 5, 6]
      returns [1, 3, 4, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [2, 5, 7]
      returns [1, 3, 4, 6]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [2, 6, 7]
      returns [1, 3, 4, 5]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [3, 4, 5]
      returns [1, 2, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [3, 4, 6]
      returns [1, 2, 5, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [3, 4, 7]
      returns [1, 2, 5, 6]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [3, 5, 6]
      returns [1, 2, 4, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [3, 5, 7]
      returns [1, 2, 4, 6]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [3, 6, 7]
      returns [1, 2, 4, 5]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [4, 5, 6]
      returns [1, 2, 3, 7]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [4, 5, 7]
      returns [1, 2, 3, 6]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [4, 6, 7]
      returns [1, 2, 3, 5]
    on [1, 2, 3, 4, 5, 6, 7], when deleting [5, 6, 7]
      returns [1, 2, 3, 4]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 2, 3]
      returns [4, 5, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 2, 4]
      returns [3, 5, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 2, 5]
      returns [3, 4, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 2, 6]
      returns [3, 4, 5, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 2, 7]
      returns [3, 4, 5, 6, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 2, 8]
      returns [3, 4, 5, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 3, 4]
      returns [2, 5, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 3, 5]
      returns [2, 4, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 3, 6]
      returns [2, 4, 5, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 3, 7]
      returns [2, 4, 5, 6, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 3, 8]
      returns [2, 4, 5, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 4, 5]
      returns [2, 3, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 4, 6]
      returns [2, 3, 5, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 4, 7]
      returns [2, 3, 5, 6, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 4, 8]
      returns [2, 3, 5, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 5, 6]
      returns [2, 3, 4, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 5, 7]
      returns [2, 3, 4, 6, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 5, 8]
      returns [2, 3, 4, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 6, 7]
      returns [2, 3, 4, 5, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 6, 8]
      returns [2, 3, 4, 5, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [1, 7, 8]
      returns [2, 3, 4, 5, 6]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [2, 3, 4]
      returns [1, 5, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [2, 3, 5]
      returns [1, 4, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [2, 3, 6]
      returns [1, 4, 5, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [2, 3, 7]
      returns [1, 4, 5, 6, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [2, 3, 8]
      returns [1, 4, 5, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [2, 4, 5]
      returns [1, 3, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [2, 4, 6]
      returns [1, 3, 5, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [2, 4, 7]
      returns [1, 3, 5, 6, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [2, 4, 8]
      returns [1, 3, 5, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [2, 5, 6]
      returns [1, 3, 4, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [2, 5, 7]
      returns [1, 3, 4, 6, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [2, 5, 8]
      returns [1, 3, 4, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [2, 6, 7]
      returns [1, 3, 4, 5, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [2, 6, 8]
      returns [1, 3, 4, 5, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [2, 7, 8]
      returns [1, 3, 4, 5, 6]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [3, 4, 5]
      returns [1, 2, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [3, 4, 6]
      returns [1, 2, 5, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [3, 4, 7]
      returns [1, 2, 5, 6, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [3, 4, 8]
      returns [1, 2, 5, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [3, 5, 6]
      returns [1, 2, 4, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [3, 5, 7]
      returns [1, 2, 4, 6, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [3, 5, 8]
      returns [1, 2, 4, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [3, 6, 7]
      returns [1, 2, 4, 5, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [3, 6, 8]
      returns [1, 2, 4, 5, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [3, 7, 8]
      returns [1, 2, 4, 5, 6]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [4, 5, 6]
      returns [1, 2, 3, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [4, 5, 7]
      returns [1, 2, 3, 6, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [4, 5, 8]
      returns [1, 2, 3, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [4, 6, 7]
      returns [1, 2, 3, 5, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [4, 6, 8]
      returns [1, 2, 3, 5, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [4, 7, 8]
      returns [1, 2, 3, 5, 6]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [5, 6, 7]
      returns [1, 2, 3, 4, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [5, 6, 8]
      returns [1, 2, 3, 4, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [5, 7, 8]
      returns [1, 2, 3, 4, 6]
    on [1, 2, 3, 4, 5, 6, 7, 8], when deleting [6, 7, 8]
      returns [1, 2, 3, 4, 5]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 2, 3]
      returns [4, 5, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 2, 4]
      returns [3, 5, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 2, 5]
      returns [3, 4, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 2, 6]
      returns [3, 4, 5, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 2, 7]
      returns [3, 4, 5, 6, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 2, 8]
      returns [3, 4, 5, 6, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 2, 9]
      returns [3, 4, 5, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 3, 4]
      returns [2, 5, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 3, 5]
      returns [2, 4, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 3, 6]
      returns [2, 4, 5, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 3, 7]
      returns [2, 4, 5, 6, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 3, 8]
      returns [2, 4, 5, 6, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 3, 9]
      returns [2, 4, 5, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 4, 5]
      returns [2, 3, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 4, 6]
      returns [2, 3, 5, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 4, 7]
      returns [2, 3, 5, 6, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 4, 8]
      returns [2, 3, 5, 6, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 4, 9]
      returns [2, 3, 5, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 5, 6]
      returns [2, 3, 4, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 5, 7]
      returns [2, 3, 4, 6, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 5, 8]
      returns [2, 3, 4, 6, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 5, 9]
      returns [2, 3, 4, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 6, 7]
      returns [2, 3, 4, 5, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 6, 8]
      returns [2, 3, 4, 5, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 6, 9]
      returns [2, 3, 4, 5, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 7, 8]
      returns [2, 3, 4, 5, 6, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 7, 9]
      returns [2, 3, 4, 5, 6, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [1, 8, 9]
      returns [2, 3, 4, 5, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 3, 4]
      returns [1, 5, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 3, 5]
      returns [1, 4, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 3, 6]
      returns [1, 4, 5, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 3, 7]
      returns [1, 4, 5, 6, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 3, 8]
      returns [1, 4, 5, 6, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 3, 9]
      returns [1, 4, 5, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 4, 5]
      returns [1, 3, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 4, 6]
      returns [1, 3, 5, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 4, 7]
      returns [1, 3, 5, 6, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 4, 8]
      returns [1, 3, 5, 6, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 4, 9]
      returns [1, 3, 5, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 5, 6]
      returns [1, 3, 4, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 5, 7]
      returns [1, 3, 4, 6, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 5, 8]
      returns [1, 3, 4, 6, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 5, 9]
      returns [1, 3, 4, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 6, 7]
      returns [1, 3, 4, 5, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 6, 8]
      returns [1, 3, 4, 5, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 6, 9]
      returns [1, 3, 4, 5, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 7, 8]
      returns [1, 3, 4, 5, 6, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 7, 9]
      returns [1, 3, 4, 5, 6, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [2, 8, 9]
      returns [1, 3, 4, 5, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [3, 4, 5]
      returns [1, 2, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [3, 4, 6]
      returns [1, 2, 5, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [3, 4, 7]
      returns [1, 2, 5, 6, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [3, 4, 8]
      returns [1, 2, 5, 6, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [3, 4, 9]
      returns [1, 2, 5, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [3, 5, 6]
      returns [1, 2, 4, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [3, 5, 7]
      returns [1, 2, 4, 6, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [3, 5, 8]
      returns [1, 2, 4, 6, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [3, 5, 9]
      returns [1, 2, 4, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [3, 6, 7]
      returns [1, 2, 4, 5, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [3, 6, 8]
      returns [1, 2, 4, 5, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [3, 6, 9]
      returns [1, 2, 4, 5, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [3, 7, 8]
      returns [1, 2, 4, 5, 6, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [3, 7, 9]
      returns [1, 2, 4, 5, 6, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [3, 8, 9]
      returns [1, 2, 4, 5, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [4, 5, 6]
      returns [1, 2, 3, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [4, 5, 7]
      returns [1, 2, 3, 6, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [4, 5, 8]
      returns [1, 2, 3, 6, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [4, 5, 9]
      returns [1, 2, 3, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [4, 6, 7]
      returns [1, 2, 3, 5, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [4, 6, 8]
      returns [1, 2, 3, 5, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [4, 6, 9]
      returns [1, 2, 3, 5, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [4, 7, 8]
      returns [1, 2, 3, 5, 6, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [4, 7, 9]
      returns [1, 2, 3, 5, 6, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [4, 8, 9]
      returns [1, 2, 3, 5, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [5, 6, 7]
      returns [1, 2, 3, 4, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [5, 6, 8]
      returns [1, 2, 3, 4, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [5, 6, 9]
      returns [1, 2, 3, 4, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [5, 7, 8]
      returns [1, 2, 3, 4, 6, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [5, 7, 9]
      returns [1, 2, 3, 4, 6, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [5, 8, 9]
      returns [1, 2, 3, 4, 6, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [6, 7, 8]
      returns [1, 2, 3, 4, 5, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [6, 7, 9]
      returns [1, 2, 3, 4, 5, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [6, 8, 9]
      returns [1, 2, 3, 4, 5, 7]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9], when deleting [7, 8, 9]
      returns [1, 2, 3, 4, 5, 6]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 2, 3]
      returns [4, 5, 6, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 2, 4]
      returns [3, 5, 6, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 2, 5]
      returns [3, 4, 6, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 2, 6]
      returns [3, 4, 5, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 2, 7]
      returns [3, 4, 5, 6, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 2, 8]
      returns [3, 4, 5, 6, 7, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 2, 9]
      returns [3, 4, 5, 6, 7, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 2, 10]
      returns [3, 4, 5, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 3, 4]
      returns [2, 5, 6, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 3, 5]
      returns [2, 4, 6, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 3, 6]
      returns [2, 4, 5, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 3, 7]
      returns [2, 4, 5, 6, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 3, 8]
      returns [2, 4, 5, 6, 7, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 3, 9]
      returns [2, 4, 5, 6, 7, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 3, 10]
      returns [2, 4, 5, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 4, 5]
      returns [2, 3, 6, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 4, 6]
      returns [2, 3, 5, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 4, 7]
      returns [2, 3, 5, 6, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 4, 8]
      returns [2, 3, 5, 6, 7, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 4, 9]
      returns [2, 3, 5, 6, 7, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 4, 10]
      returns [2, 3, 5, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 5, 6]
      returns [2, 3, 4, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 5, 7]
      returns [2, 3, 4, 6, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 5, 8]
      returns [2, 3, 4, 6, 7, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 5, 9]
      returns [2, 3, 4, 6, 7, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 5, 10]
      returns [2, 3, 4, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 6, 7]
      returns [2, 3, 4, 5, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 6, 8]
      returns [2, 3, 4, 5, 7, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 6, 9]
      returns [2, 3, 4, 5, 7, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 6, 10]
      returns [2, 3, 4, 5, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 7, 8]
      returns [2, 3, 4, 5, 6, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 7, 9]
      returns [2, 3, 4, 5, 6, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 7, 10]
      returns [2, 3, 4, 5, 6, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 8, 9]
      returns [2, 3, 4, 5, 6, 7, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 8, 10]
      returns [2, 3, 4, 5, 6, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [1, 9, 10]
      returns [2, 3, 4, 5, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 3, 4]
      returns [1, 5, 6, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 3, 5]
      returns [1, 4, 6, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 3, 6]
      returns [1, 4, 5, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 3, 7]
      returns [1, 4, 5, 6, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 3, 8]
      returns [1, 4, 5, 6, 7, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 3, 9]
      returns [1, 4, 5, 6, 7, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 3, 10]
      returns [1, 4, 5, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 4, 5]
      returns [1, 3, 6, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 4, 6]
      returns [1, 3, 5, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 4, 7]
      returns [1, 3, 5, 6, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 4, 8]
      returns [1, 3, 5, 6, 7, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 4, 9]
      returns [1, 3, 5, 6, 7, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 4, 10]
      returns [1, 3, 5, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 5, 6]
      returns [1, 3, 4, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 5, 7]
      returns [1, 3, 4, 6, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 5, 8]
      returns [1, 3, 4, 6, 7, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 5, 9]
      returns [1, 3, 4, 6, 7, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 5, 10]
      returns [1, 3, 4, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 6, 7]
      returns [1, 3, 4, 5, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 6, 8]
      returns [1, 3, 4, 5, 7, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 6, 9]
      returns [1, 3, 4, 5, 7, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 6, 10]
      returns [1, 3, 4, 5, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 7, 8]
      returns [1, 3, 4, 5, 6, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 7, 9]
      returns [1, 3, 4, 5, 6, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 7, 10]
      returns [1, 3, 4, 5, 6, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 8, 9]
      returns [1, 3, 4, 5, 6, 7, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 8, 10]
      returns [1, 3, 4, 5, 6, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [2, 9, 10]
      returns [1, 3, 4, 5, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 4, 5]
      returns [1, 2, 6, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 4, 6]
      returns [1, 2, 5, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 4, 7]
      returns [1, 2, 5, 6, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 4, 8]
      returns [1, 2, 5, 6, 7, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 4, 9]
      returns [1, 2, 5, 6, 7, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 4, 10]
      returns [1, 2, 5, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 5, 6]
      returns [1, 2, 4, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 5, 7]
      returns [1, 2, 4, 6, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 5, 8]
      returns [1, 2, 4, 6, 7, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 5, 9]
      returns [1, 2, 4, 6, 7, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 5, 10]
      returns [1, 2, 4, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 6, 7]
      returns [1, 2, 4, 5, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 6, 8]
      returns [1, 2, 4, 5, 7, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 6, 9]
      returns [1, 2, 4, 5, 7, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 6, 10]
      returns [1, 2, 4, 5, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 7, 8]
      returns [1, 2, 4, 5, 6, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 7, 9]
      returns [1, 2, 4, 5, 6, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 7, 10]
      returns [1, 2, 4, 5, 6, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 8, 9]
      returns [1, 2, 4, 5, 6, 7, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 8, 10]
      returns [1, 2, 4, 5, 6, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [3, 9, 10]
      returns [1, 2, 4, 5, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [4, 5, 6]
      returns [1, 2, 3, 7, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [4, 5, 7]
      returns [1, 2, 3, 6, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [4, 5, 8]
      returns [1, 2, 3, 6, 7, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [4, 5, 9]
      returns [1, 2, 3, 6, 7, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [4, 5, 10]
      returns [1, 2, 3, 6, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [4, 6, 7]
      returns [1, 2, 3, 5, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [4, 6, 8]
      returns [1, 2, 3, 5, 7, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [4, 6, 9]
      returns [1, 2, 3, 5, 7, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [4, 6, 10]
      returns [1, 2, 3, 5, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [4, 7, 8]
      returns [1, 2, 3, 5, 6, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [4, 7, 9]
      returns [1, 2, 3, 5, 6, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [4, 7, 10]
      returns [1, 2, 3, 5, 6, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [4, 8, 9]
      returns [1, 2, 3, 5, 6, 7, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [4, 8, 10]
      returns [1, 2, 3, 5, 6, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [4, 9, 10]
      returns [1, 2, 3, 5, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [5, 6, 7]
      returns [1, 2, 3, 4, 8, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [5, 6, 8]
      returns [1, 2, 3, 4, 7, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [5, 6, 9]
      returns [1, 2, 3, 4, 7, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [5, 6, 10]
      returns [1, 2, 3, 4, 7, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [5, 7, 8]
      returns [1, 2, 3, 4, 6, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [5, 7, 9]
      returns [1, 2, 3, 4, 6, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [5, 7, 10]
      returns [1, 2, 3, 4, 6, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [5, 8, 9]
      returns [1, 2, 3, 4, 6, 7, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [5, 8, 10]
      returns [1, 2, 3, 4, 6, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [5, 9, 10]
      returns [1, 2, 3, 4, 6, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [6, 7, 8]
      returns [1, 2, 3, 4, 5, 9, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [6, 7, 9]
      returns [1, 2, 3, 4, 5, 8, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [6, 7, 10]
      returns [1, 2, 3, 4, 5, 8, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [6, 8, 9]
      returns [1, 2, 3, 4, 5, 7, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [6, 8, 10]
      returns [1, 2, 3, 4, 5, 7, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [6, 9, 10]
      returns [1, 2, 3, 4, 5, 7, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [7, 8, 9]
      returns [1, 2, 3, 4, 5, 6, 10]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [7, 8, 10]
      returns [1, 2, 3, 4, 5, 6, 9]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [7, 9, 10]
      returns [1, 2, 3, 4, 5, 6, 8]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], when deleting [8, 9, 10]
      returns [1, 2, 3, 4, 5, 6, 7]
  #delete?
    with an existing value
      preserves the original
      returns a copy with the remaining values
    with a non-existing value
      preserves the original values
      returns false

Immutable::SortedSet
  #difference
    for [] and []
      returns []
    for ["A"] and []
      returns ["A"]
    for ["A"] and ["A"]
      returns []
    for ["A", "B", "C"] and ["B"]
      returns ["A", "C"]
    for ["A", "B", "C"] and ["A", "C"]
      returns ["B"]
    for ["A", "B", "C", "D", "E", "F"] and ["B", "E", "F", "G", "M", "X"]
      returns ["A", "C", "D"]
  #subtract
    for [] and []
      returns []
    for ["A"] and []
      returns ["A"]
    for ["A"] and ["A"]
      returns []
    for ["A", "B", "C"] and ["B"]
      returns ["A", "C"]
    for ["A", "B", "C"] and ["A", "C"]
      returns ["B"]
    for ["A", "B", "C", "D", "E", "F"] and ["B", "E", "F", "G", "M", "X"]
      returns ["A", "C", "D"]
  #-
    for [] and []
      returns []
    for ["A"] and []
      returns ["A"]
    for ["A"] and ["A"]
      returns []
    for ["A", "B", "C"] and ["B"]
      returns ["A", "C"]
    for ["A", "B", "C"] and ["A", "C"]
      returns ["B"]
    for ["A", "B", "C", "D", "E", "F"] and ["B", "E", "F", "G", "M", "X"]
      returns ["A", "C", "D"]

Immutable::SortedSet
  #disjoint?
    for [] and []
      returns true
    for ["A"] and []
      returns true
    for [] and ["A"]
      returns true
    for ["A"] and ["A"]
      returns false
    for ["A", "B", "C"] and ["B"]
      returns false
    for ["B"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["D", "E"]
      returns true
    for ["F", "G", "H", "I"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "B", "C", "D"]
      returns false
    for ["D", "E", "F", "G"] and ["A", "B", "C"]
      returns true

Immutable::SortedSet
  #drop
    0 from []
      preserves the original
      returns []
    10 from []
      preserves the original
      returns []
    10 from ["A"]
      preserves the original
      returns []
    0 from ["A", "B", "C"]
      preserves the original
      returns ["A", "B", "C"]
    1 from ["A", "B", "C"]
      preserves the original
      returns ["B", "C"]
    2 from ["A", "B", "C"]
      preserves the original
      returns ["C"]
    3 from ["A", "B", "C"]
      preserves the original
      returns []
    when argument is zero
      returns self
    when the set has a custom order
      maintains the custom order
      keeps the comparator even when set is cleared
    when called on a subclass
      should return an instance of the subclass

Immutable::SortedSet
  #drop_while
    on []
      with a block
        preserves the original
        returns []
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        preserves the original
        returns []
      without a block
        returns an Enumerator
    on ["A", "B", "C"]
      with a block
        preserves the original
        returns ["C"]
      without a block
        returns an Enumerator
    on ["A", "B", "C", "D", "E", "F", "G"]
      with a block
        preserves the original
        returns ["C", "D", "E", "F", "G"]
      without a block
        returns an Enumerator

Immutable::SortedSet
  #each
    with no block
      returns an Enumerator
    with a block
      returns self
      iterates over the items in order

Immutable::SortedSet
  #empty?
    on []
      returns true
    on ["A"]
      returns false
    on ["A", "B", "C"]
      returns false
  .empty
    returns the canonical empty set
    from a subclass
      returns an empty instance of the subclass

Immutable::SortedSet
  #eql?
    when comparing to a standard set
      returns false
    when comparing to a arbitrary object
      returns false
    when comparing to an Immutable::Set
      returns false
    when comparing with a subclass of Immutable::SortedSet
      returns false
    with an empty set for each comparison
      returns true
    with an empty set and a set with nil
      returns false
    with a single item array and empty array
      returns false
    with matching single item array
      returns true
    with mismatching single item array
      returns false
    with a multi-item array and single item array
      returns false
    with matching multi-item array
      returns true
    with a mismatching multi-item array
      returns true
    with the same values, but a different sort order
      returns false

Immutable::SortedSet
  #exclusion
    for [] and []
      returns []
    for ["A"] and []
      returns ["A"]
    for ["A"] and ["A"]
      returns []
    for ["A", "B", "C"] and ["B"]
      returns ["A", "C"]
    for ["A", "B", "C"] and ["B", "C", "D"]
      returns ["A", "D"]
    for ["A", "B", "C"] and ["D", "E", "F"]
      returns ["A", "B", "C", "D", "E", "F"]
  #^
    for [] and []
      returns []
    for ["A"] and []
      returns ["A"]
    for ["A"] and ["A"]
      returns []
    for ["A", "B", "C"] and ["B"]
      returns ["A", "C"]
    for ["A", "B", "C"] and ["B", "C", "D"]
      returns ["A", "D"]
    for ["A", "B", "C"] and ["D", "E", "F"]
      returns ["A", "B", "C", "D", "E", "F"]

Immutable::SortedSet
  #fetch
    gives precedence to default block over default argument if passed both
    with no default provided
      when the index exists
        returns the value at the index
      when the key does not exist
        raises an IndexError
    with a default value
      when the index exists
        returns the value at the index
      when the index does not exist
        returns the default value
    with a default block
      when the index exists
        returns the value at the index
      when the index does not exist
        invokes the block with the missing index as parameter

Immutable::SortedSet
  #find_index
    looking for "A" in [] without block
      returns nil
    looking for "A" in [] with block
      returns nil
    looking for nil in [] with block
      returns nil
    looking for "A" in ["A"] without block
      returns 0
    looking for "A" in ["A"] with block
      returns 0
    looking for "B" in ["A"] without block
      returns nil
    looking for "B" in ["A"] with block
      returns nil
    looking for nil in ["A"] with block
      returns nil
    looking for "A" in ["A", "B", "C"] without block
      returns 0
    looking for "A" in ["A", "B", "C"] with block
      returns 0
    looking for "B" in ["A", "B", "C"] without block
      returns 1
    looking for "B" in ["A", "B", "C"] with block
      returns 1
    looking for "C" in ["A", "B", "C"] without block
      returns 2
    looking for "C" in ["A", "B", "C"] with block
      returns 2
    looking for "D" in ["A", "B", "C"] without block
      returns nil
    looking for "D" in ["A", "B", "C"] with block
      returns nil
    looking for 1 in 0..1 without block
      returns 1
    looking for 1 in 0..1 with block
      returns 1
    looking for 5 in 0..10 without block
      returns 5
    looking for 5 in 0..10 with block
      returns 5
    looking for 10 in 0..10 without block
      returns 10
    looking for 10 in 0..10 with block
      returns 10
    looking for 2 in [2] without block
      returns 0
    looking for 2 in [2] with block
      returns 0
    looking for 2.0 in [2] without block
      returns 0
    looking for 2.0 in [2] with block
      returns 0
    looking for 2.0 in [2.0] without block
      returns 0
    looking for 2.0 in [2.0] with block
      returns 0
    looking for 2 in [2.0] without block
      returns 0
    looking for 2 in [2.0] with block
      returns 0
  #index
    looking for "A" in [] without block
      returns nil
    looking for "A" in [] with block
      returns nil
    looking for nil in [] with block
      returns nil
    looking for "A" in ["A"] without block
      returns 0
    looking for "A" in ["A"] with block
      returns 0
    looking for "B" in ["A"] without block
      returns nil
    looking for "B" in ["A"] with block
      returns nil
    looking for nil in ["A"] with block
      returns nil
    looking for "A" in ["A", "B", "C"] without block
      returns 0
    looking for "A" in ["A", "B", "C"] with block
      returns 0
    looking for "B" in ["A", "B", "C"] without block
      returns 1
    looking for "B" in ["A", "B", "C"] with block
      returns 1
    looking for "C" in ["A", "B", "C"] without block
      returns 2
    looking for "C" in ["A", "B", "C"] with block
      returns 2
    looking for "D" in ["A", "B", "C"] without block
      returns nil
    looking for "D" in ["A", "B", "C"] with block
      returns nil
    looking for 1 in 0..1 without block
      returns 1
    looking for 1 in 0..1 with block
      returns 1
    looking for 5 in 0..10 without block
      returns 5
    looking for 5 in 0..10 with block
      returns 5
    looking for 10 in 0..10 without block
      returns 10
    looking for 10 in 0..10 with block
      returns 10
    looking for 2 in [2] without block
      returns 0
    looking for 2 in [2] with block
      returns 0
    looking for 2.0 in [2] without block
      returns 0
    looking for 2.0 in [2] with block
      returns 0
    looking for 2.0 in [2.0] without block
      returns 0
    looking for 2.0 in [2.0] with block
      returns 0
    looking for 2 in [2.0] without block
      returns 0
    looking for 2 in [2.0] with block
      returns 0

Immutable::SortedSet
  #first
    on []
      returns nil
    on ["A"]
      returns "A"
    on ["A", "B", "C"]
      returns "A"
    on ["Z", "Y", "X"]
      returns "X"

Immutable::SortedSet
  #from
    when called without a block
      returns a sorted set of all items equal to or greater than the argument
    when called with a block
      yields all the items equal to or greater than than the argument
    on an empty set
      returns an empty set
    with an argument higher than all the values in the set
      returns an empty set

Immutable::SortedSet
  #group_by
    with a block
      on []
        preserves the original
        returns []
      on [1]
        preserves the original
        returns [{true=>Immutable::SortedSet[1]}]
      on [1, 2, 3, 4]
        preserves the original
        returns [{true=>Immutable::SortedSet[1, 3], false=>Immutable::SortedSet[2, 4]}]
    without a block
      on []
        preserves the original
        returns []
      on [1]
        preserves the original
        returns [{1=>Immutable::SortedSet[1]}]
      on [1, 2, 3, 4]
        preserves the original
        returns [{1=>Immutable::SortedSet[1], 2=>Immutable::SortedSet[2], 3=>Immutable::SortedSet[3], 4=>Immutable::SortedSet[4]}]
    from a subclass
      returns an Hash whose values are instances of the subclass
  #group
    with a block
      on []
        preserves the original
        returns []
      on [1]
        preserves the original
        returns [{true=>Immutable::SortedSet[1]}]
      on [1, 2, 3, 4]
        preserves the original
        returns [{true=>Immutable::SortedSet[1, 3], false=>Immutable::SortedSet[2, 4]}]
    without a block
      on []
        preserves the original
        returns []
      on [1]
        preserves the original
        returns [{1=>Immutable::SortedSet[1]}]
      on [1, 2, 3, 4]
        preserves the original
        returns [{1=>Immutable::SortedSet[1], 2=>Immutable::SortedSet[2], 3=>Immutable::SortedSet[3], 4=>Immutable::SortedSet[4]}]
    from a subclass
      returns an Hash whose values are instances of the subclass
  #classify
    with a block
      on []
        preserves the original
        returns []
      on [1]
        preserves the original
        returns [{true=>Immutable::SortedSet[1]}]
      on [1, 2, 3, 4]
        preserves the original
        returns [{true=>Immutable::SortedSet[1, 3], false=>Immutable::SortedSet[2, 4]}]
    without a block
      on []
        preserves the original
        returns []
      on [1]
        preserves the original
        returns [{1=>Immutable::SortedSet[1]}]
      on [1, 2, 3, 4]
        preserves the original
        returns [{1=>Immutable::SortedSet[1], 2=>Immutable::SortedSet[2], 3=>Immutable::SortedSet[3], 4=>Immutable::SortedSet[4]}]
    from a subclass
      returns an Hash whose values are instances of the subclass

Immutable::SortedSet
  #include?
    returns true for an existing value (1)
    returns true for an existing value (2)
    returns true for an existing value (3)
    returns true for an existing value (4.0)
    returns false for a non-existing value
    uses #<=> for equality
  #member?
    returns true for an existing value (1)
    returns true for an existing value (2)
    returns true for an existing value (3)
    returns true for an existing value (4.0)
    returns false for a non-existing value
    uses #<=> for equality

Immutable::SortedSet
  #inspect
    on []
      returns "Immutable::SortedSet[]"
      returns a string which can be eval'd to get an equivalent set
    on ["A"]
      returns "Immutable::SortedSet[\"A\"]"
      returns a string which can be eval'd to get an equivalent set
    on ["C", "B", "A"]
      returns "Immutable::SortedSet[\"A\", \"B\", \"C\"]"
      returns a string which can be eval'd to get an equivalent set
    from a subclass
      returns a programmer-readable representation of the set contents
      returns a string which can be eval'd to get an equivalent set

Immutable::SortedSet
  #intersect?
    for [] and []
      returns false
    for ["A"] and []
      returns false
    for [] and ["A"]
      returns false
    for ["A"] and ["A"]
      returns true
    for ["A", "B", "C"] and ["B"]
      returns true
    for ["B"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["D", "E"]
      returns false
    for ["F", "G", "H", "I"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "B", "C", "D"]
      returns true
    for ["D", "E", "F", "G"] and ["A", "B", "C"]
      returns false

Immutable::SortedSet
  #intersection
    for [] and []
      returns []
    for [] and []
      returns []
    for ["A"] and []
      returns []
    for [] and ["A"]
      returns []
    for ["A"] and ["A"]
      returns ["A"]
    for ["A"] and ["A"]
      returns ["A"]
    for ["A", "B", "C"] and ["B"]
      returns ["B"]
    for ["B"] and ["A", "B", "C"]
      returns ["B"]
    for ["A", "B", "C"] and ["A", "C"]
      returns ["A", "C"]
    for ["A", "C"] and ["A", "B", "C"]
      returns ["A", "C"]
    for ["A", "M", "T", "X"] and ["B", "C", "D", "E", "F", "G", "H", "I", "M", "P", "Q", "T", "U"]
      returns ["M", "T"]
    for ["B", "C", "D", "E", "F", "G", "H", "I", "M", "P", "Q", "T", "U"] and ["A", "M", "T", "X"]
      returns ["M", "T"]
  #&
    for [] and []
      returns []
    for [] and []
      returns []
    for ["A"] and []
      returns []
    for [] and ["A"]
      returns []
    for ["A"] and ["A"]
      returns ["A"]
    for ["A"] and ["A"]
      returns ["A"]
    for ["A", "B", "C"] and ["B"]
      returns ["B"]
    for ["B"] and ["A", "B", "C"]
      returns ["B"]
    for ["A", "B", "C"] and ["A", "C"]
      returns ["A", "C"]
    for ["A", "C"] and ["A", "B", "C"]
      returns ["A", "C"]
    for ["A", "M", "T", "X"] and ["B", "C", "D", "E", "F", "G", "H", "I", "M", "P", "Q", "T", "U"]
      returns ["M", "T"]
    for ["B", "C", "D", "E", "F", "G", "H", "I", "M", "P", "Q", "T", "U"] and ["A", "M", "T", "X"]
      returns ["M", "T"]

Immutable::SortedSet
  #last
    with an empty set
      returns the last item
    with a single item set
      returns the last item
    with a multi-item set
      returns the last item

Immutable::SortedSet
  #map
    when empty
      returns self
    when not empty
      with a block
        preserves the original values
        returns a new set with the mapped values
        filters out duplicates
      with no block
        returns an Enumerator
    on a set ordered by a comparator
      returns a new set with the mapped values
      filters out duplicates
  #collect
    when empty
      returns self
    when not empty
      with a block
        preserves the original values
        returns a new set with the mapped values
        filters out duplicates
      with no block
        returns an Enumerator
    on a set ordered by a comparator
      returns a new set with the mapped values
      filters out duplicates

Immutable::SortedSet
  #marshal_dump/#marshal_load
    can survive dumping and loading into a new process
    is still possible to find items by index after loading
    raises a TypeError if set has a custom sort order

Immutable::SortedSet
  #max
    with a block
      on []
        returns nil
      on ["A"]
        returns "A"
      on ["Ichi", "Ni", "San"]
        returns "Ichi"
    without a block
      on []
        returns nil
      on ["A"]
        returns "A"
      on ["Ichi", "Ni", "San"]
        returns "San"

Immutable::SortedSet
  #min
    on []
      returns nil
    on ["A"]
      returns "A"
    on ["Ichi", "Ni", "San"]
      returns "Ichi"
    on [1, 2, 3, 4, 5]
      returns 1
    on [0, -0.0, 2.2, -4, -4.2]
      returns -4.2

Immutable::SortedSet
  .new
    accepts a single enumerable argument and creates a new sorted set
    also works with a Range
    doesn't mutate the initializer
    doesn't change if the initializer is later mutated
    is amenable to overriding of #initialize
    accepts a block with arity 1
    accepts a block with arity 2
    can use a block produced by Symbol#to_proc
    filters out duplicates
    when passed a comparator with arity 2
      still filters out duplicates
      still doesn't mutate the initializer
      still doesn't change if the initializer is later mutated
    when passed a block with arity 1
      still filters out duplicates
      still doesn't mutate the initializer
      still doesn't change if the initializer is later mutated
    from a subclass
      returns a frozen instance of the subclass
  .[]
    accepts a variable number of items and creates a new sorted set
    filters out duplicate items

Immutable::SortedSet
  #reverse_each
    with no block
      returns an Enumerator
    with a block
      returns self
      iterates over the items in order

Immutable::SortedSet
  #sample
    returns a randomly chosen item

Immutable::SortedSet
  #select
    when everything matches
      preserves the original
      returns self
    when only some things match
      with a block
        preserves the original
        returns a set with the matching values
      with no block
        returns an Enumerator
    when nothing matches
      preserves the original
      returns the canonical empty set
    from a subclass
      returns an instance of the same class
  #find_all
    when everything matches
      preserves the original
      returns self
    when only some things match
      with a block
        preserves the original
        returns a set with the matching values
      with no block
        returns an Enumerator
    when nothing matches
      preserves the original
      returns the canonical empty set
    from a subclass
      returns an instance of the same class

Immutable::SortedSet
  #size
    returns 0 for []
    returns 1 for ["A"]
    returns 3 for ["A", "B", "C"]
  #length
    returns 0 for []
    returns 1 for ["A"]
    returns 3 for ["A", "B", "C"]

Immutable::SortedSet
  #slice
    when passed a positive integral index
      returns the element at that index
      leaves the original unchanged
    when passed a negative integral index
      returns the element which is number (index.abs) counting from the end of the sorted_set
    when passed a positive integral index and count
      returns 'count' elements starting from 'index'
      leaves the original unchanged
    when passed a negative integral index and count
      returns 'count' elements, starting from index which is number 'index.abs' counting from the end of the array
    when passed a Range
      returns the elements whose indexes are within the given Range
      leaves the original unchanged
  when passed an empty Range
    does not lose custom sort order
  when passed a length of zero
    does not lose custom sort order
  when passed a subclass of Range
    works the same as with a Range
  on a subclass of SortedSet
    with index and count or a range, returns an instance of the subclass
  #[]
    when passed a positive integral index
      returns the element at that index
      leaves the original unchanged
    when passed a negative integral index
      returns the element which is number (index.abs) counting from the end of the sorted_set
    when passed a positive integral index and count
      returns 'count' elements starting from 'index'
      leaves the original unchanged
    when passed a negative integral index and count
      returns 'count' elements, starting from index which is number 'index.abs' counting from the end of the array
    when passed a Range
      returns the elements whose indexes are within the given Range
      leaves the original unchanged
  when passed an empty Range
    does not lose custom sort order
  when passed a length of zero
    does not lose custom sort order
  when passed a subclass of Range
    works the same as with a Range
  on a subclass of SortedSet
    with index and count or a range, returns an instance of the subclass

Immutable::SortedSet
  #sort
    on []
      with a block
        preserves the original
        returns []
      without a block
        preserves the original
        returns []
    on ["A"]
      with a block
        preserves the original
        returns ["A"]
      without a block
        preserves the original
        returns ["A"]
    on ["Ichi", "Ni", "San"]
      with a block
        preserves the original
        returns ["Ni", "San", "Ichi"]
      without a block
        preserves the original
        returns ["Ichi", "Ni", "San"]
  #sort_by
    on []
      with a block
        preserves the original
        returns []
      without a block
        preserves the original
        returns []
    on ["A"]
      with a block
        preserves the original
        returns ["A"]
      without a block
        preserves the original
        returns ["A"]
    on ["Ichi", "Ni", "San"]
      with a block
        preserves the original
        returns ["Ni", "San", "Ichi"]
      without a block
        preserves the original
        returns ["Ichi", "Ni", "San"]
  sort
    on a SortedSet with custom sort order
      returns a SortedSet with the natural sort order

Immutable::SortedSet
  #subset?
    for [] and []
      returns true
    for ["A"] and []
      returns false
    for [] and ["A"]
      returns true
    for ["A"] and ["A"]
      returns true
    for ["A", "B", "C"] and ["B"]
      returns false
    for ["B"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "C"]
      returns false
    for ["A", "C"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "B", "C", "D"]
      returns true
    for ["A", "B", "C", "D"] and ["A", "B", "C"]
      returns false
  #proper_subset?
    for [] and []
      returns false
    for ["A"] and []
      returns false
    for [] and ["A"]
      returns true
    for ["A"] and ["A"]
      returns false
    for ["A", "B", "C"] and ["B"]
      returns false
    for ["B"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "C"]
      returns false
    for ["A", "C"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "B", "C", "D"]
      returns true
    for ["A", "B", "C", "D"] and ["A", "B", "C"]
      returns false

Immutable::SortedSet
  #superset?
    for [] and []
      returns true
    for ["A"] and []
      returns true
    for [] and ["A"]
      returns false
    for ["A"] and ["A"]
      returns true
    for ["A", "B", "C"] and ["B"]
      returns true
    for ["B"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "C"]
      returns true
    for ["A", "C"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns true
    for ["A", "B", "C"] and ["A", "B", "C", "D"]
      returns false
    for ["A", "B", "C", "D"] and ["A", "B", "C"]
      returns true
  #proper_superset?
    for [] and []
      returns false
    for ["A"] and []
      returns true
    for [] and ["A"]
      returns false
    for ["A"] and ["A"]
      returns false
    for ["A", "B", "C"] and ["B"]
      returns true
    for ["B"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "C"]
      returns true
    for ["A", "C"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "B", "C"]
      returns false
    for ["A", "B", "C"] and ["A", "B", "C", "D"]
      returns false
    for ["A", "B", "C", "D"] and ["A", "B", "C"]
      returns true

Immutable::SortedSet
  #take
    10 from []
      preserves the original
      returns []
    10 from ["A"]
      preserves the original
      returns ["A"]
    0 from ["A", "B", "C"]
      preserves the original
      returns []
    2 from ["A", "B", "C"]
      preserves the original
      returns ["A", "B"]
    when argument is at least size of receiver
      returns self
    when the set has a custom order
      maintains the custom order
      keeps the comparator even when set is cleared
    when called on a subclass
      should return an instance of the subclass

Immutable::SortedSet
  #take_while
    on []
      with a block
        returns []
        preserves the original
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns ["A"]
        preserves the original
      without a block
        returns an Enumerator
    on ["A", "B", "C"]
      with a block
        returns ["A", "B"]
        preserves the original
      without a block
        returns an Enumerator

Immutable::SortedSet
  #to_set
    on []
      returns a set with the same values
    on ["A"]
      returns a set with the same values
    on ["A", "B", "C"]
      returns a set with the same values

Immutable::SortedSet
  #union
    for [] and []
      returns []
    for [] and []
      returns []
    for ["A"] and []
      returns ["A"]
    for [] and ["A"]
      returns ["A"]
    for ["A"] and ["A"]
      returns ["A"]
    for ["A"] and ["A"]
      returns ["A"]
    for ["A", "B", "C"] and []
      returns ["A", "B", "C"]
    for [] and ["A", "B", "C"]
      returns ["A", "B", "C"]
    for ["A", "C", "E", "G", "X"] and ["B", "C", "D", "E", "H", "M"]
      returns ["A", "B", "C", "D", "E", "G", "H", "M", "X"]
    for ["B", "C", "D", "E", "H", "M"] and ["A", "C", "E", "G", "X"]
      returns ["A", "B", "C", "D", "E", "G", "H", "M", "X"]
  #|
    for [] and []
      returns []
    for [] and []
      returns []
    for ["A"] and []
      returns ["A"]
    for [] and ["A"]
      returns ["A"]
    for ["A"] and ["A"]
      returns ["A"]
    for ["A"] and ["A"]
      returns ["A"]
    for ["A", "B", "C"] and []
      returns ["A", "B", "C"]
    for [] and ["A", "B", "C"]
      returns ["A", "B", "C"]
    for ["A", "C", "E", "G", "X"] and ["B", "C", "D", "E", "H", "M"]
      returns ["A", "B", "C", "D", "E", "G", "H", "M", "X"]
    for ["B", "C", "D", "E", "H", "M"] and ["A", "C", "E", "G", "X"]
      returns ["A", "B", "C", "D", "E", "G", "H", "M", "X"]
  #+
    for [] and []
      returns []
    for [] and []
      returns []
    for ["A"] and []
      returns ["A"]
    for [] and ["A"]
      returns ["A"]
    for ["A"] and ["A"]
      returns ["A"]
    for ["A"] and ["A"]
      returns ["A"]
    for ["A", "B", "C"] and []
      returns ["A", "B", "C"]
    for [] and ["A", "B", "C"]
      returns ["A", "B", "C"]
    for ["A", "C", "E", "G", "X"] and ["B", "C", "D", "E", "H", "M"]
      returns ["A", "B", "C", "D", "E", "G", "H", "M", "X"]
    for ["B", "C", "D", "E", "H", "M"] and ["A", "C", "E", "G", "X"]
      returns ["A", "B", "C", "D", "E", "G", "H", "M", "X"]
  #merge
    for [] and []
      returns []
    for [] and []
      returns []
    for ["A"] and []
      returns ["A"]
    for [] and ["A"]
      returns ["A"]
    for ["A"] and ["A"]
      returns ["A"]
    for ["A"] and ["A"]
      returns ["A"]
    for ["A", "B", "C"] and []
      returns ["A", "B", "C"]
    for [] and ["A", "B", "C"]
      returns ["A", "B", "C"]
    for ["A", "C", "E", "G", "X"] and ["B", "C", "D", "E", "H", "M"]
      returns ["A", "B", "C", "D", "E", "G", "H", "M", "X"]
    for ["B", "C", "D", "E", "H", "M"] and ["A", "C", "E", "G", "X"]
      returns ["A", "B", "C", "D", "E", "G", "H", "M", "X"]
  union
    filters out duplicates when passed an Array
    doesn't mutate an Array which is passed in
    on a set ordered by a comparator
      still filters out duplicates when passed an Array
      still doesn't mutate an Array which is passed in

Immutable::SortedSet
  #up_to
    when called without a block
      returns a sorted set of all items equal to or less than the argument
    when called with a block
      yields all the items equal to or less than than the argument
    on an empty set
      returns an empty set
    with an argument less than all the values in the set
      returns an empty set

Immutable::SortedSet
  .uniq_by_comparator!
    can handle empty arrays
    can handle arrays with 1 element
    can handle arrays with 2 elements and no dupes
    can handle arrays with 2 elements and dupes
    can handle arrays with lots of elements
    works with funny comparators

Immutable::SortedSet
  #values_at
    accepts any number of indices, and returns a sorted_set of items at those indices
    when passed invalid indices
      filters them out
    when passed no arguments
      returns an empty sorted_set
    from a subclass
      returns an instance of the subclass

Immutable::Vector
  #add
    with a empty vector adding a single item
      preserves the original
      adds the item to the vector
    with a single-item vector adding a different item
      preserves the original
      adds the item to the vector
    with a single-item vector adding a duplicate item
      preserves the original
      adds the item to the vector
    with a 31-item vector adding a different item
      preserves the original
      adds the item to the vector
    with a 32-item vector adding a different item
      preserves the original
      adds the item to the vector
    with a 33-item vector adding a different item
      preserves the original
      adds the item to the vector
    with a 1023-item vector adding a different item
      preserves the original
      adds the item to the vector
    with a 1024-item vector adding a different item
      preserves the original
      adds the item to the vector
    with a 1025-item vector adding a different item
      preserves the original
      adds the item to the vector
    from a subclass
      returns an instance of the subclass
  #<<
    with a empty vector adding a single item
      preserves the original
      adds the item to the vector
    with a single-item vector adding a different item
      preserves the original
      adds the item to the vector
    with a single-item vector adding a duplicate item
      preserves the original
      adds the item to the vector
    with a 31-item vector adding a different item
      preserves the original
      adds the item to the vector
    with a 32-item vector adding a different item
      preserves the original
      adds the item to the vector
    with a 33-item vector adding a different item
      preserves the original
      adds the item to the vector
    with a 1023-item vector adding a different item
      preserves the original
      adds the item to the vector
    with a 1024-item vector adding a different item
      preserves the original
      adds the item to the vector
    with a 1025-item vector adding a different item
      preserves the original
      adds the item to the vector
    from a subclass
      returns an instance of the subclass
  #push
    with a empty vector adding a single item
      preserves the original
      adds the item to the vector
    with a single-item vector adding a different item
      preserves the original
      adds the item to the vector
    with a single-item vector adding a duplicate item
      preserves the original
      adds the item to the vector
    with a 31-item vector adding a different item
      preserves the original
      adds the item to the vector
    with a 32-item vector adding a different item
      preserves the original
      adds the item to the vector
    with a 33-item vector adding a different item
      preserves the original
      adds the item to the vector
    with a 1023-item vector adding a different item
      preserves the original
      adds the item to the vector
    with a 1024-item vector adding a different item
      preserves the original
      adds the item to the vector
    with a 1025-item vector adding a different item
      preserves the original
      adds the item to the vector
    from a subclass
      returns an instance of the subclass

Immutable::Vector
  #any?
    when created with no values
      with a block
        returns false
      with a block
        returns false
    when created with values
      with a block that returns true
        returns true
      with a block that doesn't return true
        returns false
      without a block
        with some values that are truthy
          returns true
        with all values that are falsey
          returns false

Immutable::Vector
  #assoc
    searches for a 2-element array with a given 1st item
    returns nil if a matching 1st item is not found
    uses #== to compare 1st items with provided object
    skips elements which are not indexable
  #rassoc
    searches for a 2-element array with a given 2nd item
    returns nil if a matching 2nd item is not found
    uses #== to compare 2nd items with provided object
    skips elements which are not indexable

Immutable::Vector
  #bsearch
    with a block which returns false for elements below desired position, and true for those at/above
      returns the first element for which the predicate is true
      if the block always returns false
        returns nil
      if the block always returns true
        returns the first element
    with a block which returns a negative number for elements below desired position, zero for the right element, and positive for those above
      returns the element for which the block returns zero
      if the block always returns positive
        returns nil
      if the block always returns negative
        returns nil
      if the block returns sometimes positive, sometimes negative, but never zero
        returns nil
      if not passed a block
        returns an Enumerator
    on an empty vector
      returns nil

Immutable::Vector
  #clear
    on []
      preserves the original
      returns an empty vector
    from a subclass
      returns an instance of the subclass
    on ["A"]
      preserves the original
      returns an empty vector
    from a subclass
      returns an instance of the subclass
    on ["A", "B", "C"]
      preserves the original
      returns an empty vector
    from a subclass
      returns an instance of the subclass

Immutable::Vector
  #combination
    works on many combinations of input
    leaves the original unmodified
    with a block
      returns self
    with no block
      returns an Enumerator
    when passed an argument which is out of bounds
      yields nothing and returns self
    when passed an argument zero
      yields an empty array
    when passed an argument equal to the vector's length
      yields self as an array
    when passed an argument 1
      yields each item in the vector, as single-item vectors
    when passed another integral argument
      yields all combinations of the given length
    on an empty vector
      works the same

Immutable::Vector
  #compact
    returns a new Vector with all nils removed
    doesn't remove false
    on an empty vector
      returns self
    from a subclass
      returns an instance of the subclass

Immutable::Vector
  #<=>
    with [] and [1]
      returns -1
    with [1] and []
      returns 1
    with [] and []
      returns 0
    with [1] and [2]
      returns -1
    with [2] and [1]
      returns 1
    with [1] and [1]
      returns 0
    with [1] and [1, 2]
      returns -1
    with [1, 2] and [1]
      returns 1
    with [1] and [1]
      returns 0
    with [2, 3, 4] and [3, 4, 5]
      returns -1
    with [3, 4, 5] and [2, 3, 4]
      returns 1
    with [2, 3, 4] and [2, 3, 4]
      returns 0
    with [[0]] and [[1]]
      returns -1
    with [[1]] and [[0]]
      returns 1
    with [[0]] and [[0]]
      returns 0

Immutable::Vector
  #+
    preserves the original
    appends the elements in the other enumerable
    on a 1-item vector
      works the same
    on a 31-item vector
      works the same
    on a 32-item vector
      works the same
    on a 33-item vector
      works the same
    on a 1023-item vector
      works the same
    on a 1024-item vector
      works the same
    on a 1025-item vector
      works the same
  #concat
    preserves the original
    appends the elements in the other enumerable
    on a 1-item vector
      works the same
    on a 31-item vector
      works the same
    on a 32-item vector
      works the same
    on a 33-item vector
      works the same
    on a 1023-item vector
      works the same
    on a 1024-item vector
      works the same
    on a 1025-item vector
      works the same

Immutable::Vector
  on []
    returns self
  on ["A"]
    returns self
  on ["A", "B", "C"]
    returns self
  on 1..32
    returns self
  on []
    returns self
  on ["A"]
    returns self
  on ["A", "B", "C"]
    returns self
  on 1..32
    returns self

Immutable::Vector
  #count
    returns the number of elements
    returns the number of elements that equal the argument
    returns the number of element for which the block evaluates to true

Immutable::Vector
  #delete_at
    removes the element at the specified index
    makes no modification if the index is out of range
    works when deleting last item at boundary where vector trie needs to get shallower
    works on an empty vector
    works on a vector with 1 item
    works on a vector with 32 items
    has the right size and contents after many deletions

Immutable::Vector
  #delete
    removes elements that are #== to the argument
    on an empty vector
      returns self
    on a subclass of Vector
      returns an instance of the subclass

Immutable::Vector
  #dig
    returns value at the index with one argument
    returns value at index in nested arrays
    raises an error when indexing deeper than possible
    returns nil if you index past the end of an array
    raises an error when indexing with a key vectors don't understand

Immutable::Vector
  #drop
    raises an ArgumentError if number of elements specified is negative
    10 from []
      preserves the original
      returns []
    10 from ["A"]
      preserves the original
      returns []
    1 from ["A"]
      preserves the original
      returns []
    0 from ["A"]
      preserves the original
      returns ["A"]
    0 from ["A", "B", "C"]
      preserves the original
      returns ["A", "B", "C"]
    2 from ["A", "B", "C"]
      preserves the original
      returns ["C"]
    3 from 1..32
      preserves the original
      returns 4..32
    32 from 1..33
      preserves the original
      returns [33]
    when number of elements specified is zero
      returns self

Immutable::Vector
  #drop_while
    returns an empty vector if block is always true
    stops dropping items if block returns nil
    stops dropping items if block returns false
    on []
      with a block
        preserves the original
        returns []
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        preserves the original
        returns []
      without a block
        returns an Enumerator
    on ["A", "B", "C"]
      with a block
        preserves the original
        returns ["C"]
      without a block
        returns an Enumerator
    on an empty vector
      returns an empty vector

Immutable::Vector
  #each_index
    with a block
      yields all the valid indices into the vector
      returns self
    without a block
      returns an Enumerator
    on an empty vector
      doesn't yield anything
    on a 1-item vector
      yields all valid indices
    on a 2-item vector
      yields all valid indices
    on a 10-item vector
      yields all valid indices
    on a 31-item vector
      yields all valid indices
    on a 32-item vector
      yields all valid indices
    on a 33-item vector
      yields all valid indices
    on a 1000-item vector
      yields all valid indices
    on a 1024-item vector
      yields all valid indices
    on a 1025-item vector
      yields all valid indices

Immutable::Vector
  #each
    with no block
      returns an Enumerator
    on a 31-item vector
      with a block
        returns self
        yields all the items
        iterates over the items in order
    on a 32-item vector
      with a block
        returns self
        yields all the items
        iterates over the items in order
    on a 33-item vector
      with a block
        returns self
        yields all the items
        iterates over the items in order
    on a 1023-item vector
      with a block
        returns self
        yields all the items
        iterates over the items in order
    on a 1024-item vector
      with a block
        returns self
        yields all the items
        iterates over the items in order
    on a 1025-item vector
      with a block
        returns self
        yields all the items
        iterates over the items in order
    on an empty vector
      doesn't yield anything

Immutable::Vector
  #each_with_index
    with no block
      returns an Enumerator
    on a 1-item vector
      with a block
        returns self
        iterates over the items in order
    on a 2-item vector
      with a block
        returns self
        iterates over the items in order
    on a 31-item vector
      with a block
        returns self
        iterates over the items in order
    on a 32-item vector
      with a block
        returns self
        iterates over the items in order
    on a 33-item vector
      with a block
        returns self
        iterates over the items in order
    on a 1023-item vector
      with a block
        returns self
        iterates over the items in order
    on a 1024-item vector
      with a block
        returns self
        iterates over the items in order
    on a 1025-item vector
      with a block
        returns self
        iterates over the items in order
    on an empty vector
      doesn't yield anything

Immutable::Vector
  #empty?
    on []
      returns true
    on ["A"]
      returns false
    on ["A", "B", "C"]
      returns false
  .empty
    returns the canonical empty vector
    from a subclass
      returns an empty instance of the subclass
      calls overridden #initialize when creating empty Hash

Immutable::Vector
  #eql
    returns false when comparing with an array with the same contents
    returns false when comparing with an arbitrary object
    returns false when comparing an empty vector with an empty array
    returns false when comparing with a subclass of Immutable::Vector
  #==
    returns true when comparing with an array with the same contents
    returns false when comparing with an arbitrary object
    returns true when comparing an empty vector with an empty array
    returns true when comparing with a subclass of Immutable::Vector
    works on larger vectors
  #eql?
    returns true
      for vectors [] and []
      for vectors [] and []
    returns false
      for vectors [] and [nil]
      for vectors [nil] and []
    returns false
      for vectors ["A"] and []
      for vectors [] and ["A"]
    returns true
      for vectors ["A"] and ["A"]
      for vectors ["A"] and ["A"]
    returns false
      for vectors ["A"] and ["B"]
      for vectors ["B"] and ["A"]
    returns false
      for vectors ["A", "B"] and ["A"]
      for vectors ["A"] and ["A", "B"]
    returns true
      for vectors ["A", "B", "C"] and ["A", "B", "C"]
      for vectors ["A", "B", "C"] and ["A", "B", "C"]
    returns false
      for vectors ["C", "A", "B"] and ["A", "B", "C"]
      for vectors ["A", "B", "C"] and ["C", "A", "B"]
  #==
    returns true
      for vectors [] and []
      for vectors [] and []
    returns false
      for vectors [] and [nil]
      for vectors [nil] and []
    returns false
      for vectors ["A"] and []
      for vectors [] and ["A"]
    returns true
      for vectors ["A"] and ["A"]
      for vectors ["A"] and ["A"]
    returns false
      for vectors ["A"] and ["B"]
      for vectors ["B"] and ["A"]
    returns false
      for vectors ["A", "B"] and ["A"]
      for vectors ["A"] and ["A", "B"]
    returns true
      for vectors ["A", "B", "C"] and ["A", "B", "C"]
      for vectors ["A", "B", "C"] and ["A", "B", "C"]
    returns false
      for vectors ["C", "A", "B"] and ["A", "B", "C"]
      for vectors ["A", "B", "C"] and ["C", "A", "B"]

Immutable::Vector
  #fetch
    gives precedence to default block over default argument if passed both
    with no default provided
      when the index exists
        returns the value at the index
      when the key does not exist
        raises an IndexError
    with a default value
      when the index exists
        returns the value at the index
      when the index does not exist
        returns the default value
    with a default block
      when the index exists
        returns the value at the index
      when the index does not exist
        invokes the block with the missing index as parameter

Immutable::Vector
  #fill
    can replace a range of items at the beginning of a vector
    can replace a range of items in the middle of a vector
    can replace a range of items at the end of a vector
    can replace all the items in a vector
    can fill past the end of the vector
    behaves like Array#fill, on a variety of inputs
    with 1 argument
      replaces all the items in the vector by default
    with 2 arguments
      replaces up to the end of the vector by default
    when index and length are 0
      leaves the vector unmodified
    when expanding a vector past boundary where vector trie needs to deepen
      works the same
    on a 1000-item vector
      works the same
    on a 1023-item vector
      works the same
    on a 1024-item vector
      works the same
    on a 1025-item vector
      works the same
    on a 2000-item vector
      works the same

Immutable::Vector
  #first
    on []
      returns nil
    on ["A"]
      returns "A"
    on ["A", "B", "C"]
      returns "A"
    on 1..32
      returns 1

Immutable::Vector
  #flat_map
    with an empty vector
      returns the flattened values as an Immutable::Vector
      returns an Immutable::Vector
    with a block that returns an empty vector
      returns the flattened values as an Immutable::Vector
      returns an Immutable::Vector
    with a vector of one item
      returns the flattened values as an Immutable::Vector
      returns an Immutable::Vector
    with a vector of multiple items
      returns the flattened values as an Immutable::Vector
      returns an Immutable::Vector

Immutable::Vector
  #flatten
    recursively flattens nested vectors into containing vector
    flattens nested arrays as well
    leaves the original unmodified
    with an integral argument
      only flattens down to the specified depth
    with an argument of zero
      returns self
    on a subclass
      returns an instance of the subclass
    on a vector with no nested vectors
      returns an unchanged vector
      on a Vector larger than 32 items initialized with Vector.new
        returns an unchanged vector

Immutable::Vector
  #get
    when empty
      always returns nil
    when not empty
      with a positive index
        within the absolute bounds of the vector
          returns the value at the specified index from the head
        outside the absolute bounds of the vector
          returns nil
      with a negative index
        within the absolute bounds of the vector
          returns the value at the specified index from the tail
        outside the absolute bounds of the vector
          returns nil
    on a 1-item vector
      works correctly, even after various addings and removings
    on a 10-item vector
      works correctly, even after various addings and removings
    on a 31-item vector
      works correctly, even after various addings and removings
    on a 32-item vector
      works correctly, even after various addings and removings
    on a 33-item vector
      works correctly, even after various addings and removings
    on a 1024-item vector
      works correctly, even after various addings and removings
    on a 1025-item vector
      works correctly, even after various addings and removings
    on a 2000-item vector
      works correctly, even after various addings and removings
  #at
    when empty
      always returns nil
    when not empty
      with a positive index
        within the absolute bounds of the vector
          returns the value at the specified index from the head
        outside the absolute bounds of the vector
          returns nil
      with a negative index
        within the absolute bounds of the vector
          returns the value at the specified index from the tail
        outside the absolute bounds of the vector
          returns nil
    on a 1-item vector
      works correctly, even after various addings and removings
    on a 10-item vector
      works correctly, even after various addings and removings
    on a 31-item vector
      works correctly, even after various addings and removings
    on a 32-item vector
      works correctly, even after various addings and removings
    on a 33-item vector
      works correctly, even after various addings and removings
    on a 1024-item vector
      works correctly, even after various addings and removings
    on a 1025-item vector
      works correctly, even after various addings and removings
    on a 2000-item vector
      works correctly, even after various addings and removings

Immutable::Vector
  #group_by
    returns a hash without default proc
    with a block
      on []
        returns []
      on [1]
        returns [{true=>Immutable::Vector[1]}]
      on [1, 2, 3, 4]
        returns [{true=>Immutable::Vector[1, 3], false=>Immutable::Vector[2, 4]}]
    without a block
      on []
        returns []
      on [1]
        returns [{1=>Immutable::Vector[1]}]
      on [1, 2, 3, 4]
        returns [{1=>Immutable::Vector[1], 2=>Immutable::Vector[2], 3=>Immutable::Vector[3], 4=>Immutable::Vector[4]}]
    on an empty vector
      returns an empty hash
    from a subclass
      returns an Hash whose values are instances of the subclass

Immutable::Vector
  #include?
    on []
      returns false
    on []
      returns false
    on ["A"]
      returns true
    on ["A"]
      returns false
    on ["A"]
      returns false
    on ["A", "B", nil]
      returns true
    on ["A", "B", nil]
      returns true
    on ["A", "B", nil]
      returns true
    on ["A", "B", nil]
      returns false
    on ["A", "B", false]
      returns true
    on [2]
      returns true
    on [2]
      returns true
    on [2.0]
      returns true
    on [2.0]
      returns true
  #member?
    on []
      returns false
    on []
      returns false
    on ["A"]
      returns true
    on ["A"]
      returns false
    on ["A"]
      returns false
    on ["A", "B", nil]
      returns true
    on ["A", "B", nil]
      returns true
    on ["A", "B", nil]
      returns true
    on ["A", "B", nil]
      returns false
    on ["A", "B", false]
      returns true
    on [2]
      returns true
    on [2]
      returns true
    on [2.0]
      returns true
    on [2.0]
      returns true

Immutable::Vector
  #insert
    can add items at the beginning of a vector
    can add items in the middle of a vector
    can add items at the end of a vector
    can add items past the end of a vector
    accepts a negative index, which counts back from the end of the vector
    raises IndexError if a negative index is too great
    works when adding an item past boundary when vector trie needs to deepen
    works when adding to an empty Vector
    has the right size and contents after many insertions

Immutable::Vector
  #inspect
    with an empty array
      returns its contents as a programmer-readable string
      returns a string which can be eval'd to get back an equivalent vector
    with a single item array
      returns its contents as a programmer-readable string
      returns a string which can be eval'd to get back an equivalent vector
    with a multi-item array
      returns its contents as a programmer-readable string
      returns a string which can be eval'd to get back an equivalent vector
    from a subclass
      returns its contents as a programmer-readable string
      returns a string which can be eval'd to get back an equivalent vector

Immutable::Vector
  #join
    with a separator
      on []
        preserves the original
        returns ""
      on ["A"]
        preserves the original
        returns "A"
      on ["A", "B", "C"]
        preserves the original
        returns "A|B|C"
    without a separator
      on []
        preserves the original
        returns ""
      on ["A"]
        preserves the original
        returns "A"
      on ["A", "B", "C"]
        preserves the original
        returns "ABC"
    without a separator (with global default separator set)
      on ["A", "B", "C"]
        returns "A**B**C"

Immutable::Vector
  #last
    with an empty vector
      returns the last item
    with a single item vector
      returns the last item
    with a multi-item vector
      returns the last item
    with a 31-item vector
      returns the last item
    with a 32-item vector
      returns the last item
    with a 33-item vector
      returns the last item
    with a 1023-item vector
      returns the last item
    with a 1024-item vector
      returns the last item
    with a 1025-item vector
      returns the last item

Immutable::Vector
  #length
    with an empty vector
      returns the values
    with a single item vector
      returns the values
    with a multi-item vector
      returns the values
    with a 31-item vector
      returns the values
    with a 32-item vector
      returns the values
    with a 33-item vector
      returns the values
    with a 1023-item vector
      returns the values
    with a 1024-item vector
      returns the values
    with a 1025-item vector
      returns the values

Immutable::Vector
  #<<
    with a empty array adding a single item
      preserves the original
      ltlts the item to the vector
    with a single-item array adding a different item
      preserves the original
      ltlts the item to the vector
    with a single-item array adding a duplicate item
      preserves the original
      ltlts the item to the vector
    with a 31-item vector adding a different item
      preserves the original
      ltlts the item to the vector
    with a 32-item vector adding a different item
      preserves the original
      ltlts the item to the vector
    with a 33-item vector adding a different item
      preserves the original
      ltlts the item to the vector
    with a 1023-item vector adding a different item
      preserves the original
      ltlts the item to the vector
    with a 1024-item vector adding a different item
      preserves the original
      ltlts the item to the vector
    with a 1025-item vector adding a different item
      preserves the original
      ltlts the item to the vector
    from a subclass
      returns an instance of the subclass

Immutable::Vector
  #map
    when empty
      returns self
    when not empty
      with a block
        preserves the original values
        returns a new vector with the mapped values
      with no block
        returns an Enumerator
    from a subclass
      returns an instance of the subclass
    on a large vector
      works
  #collect
    when empty
      returns self
    when not empty
      with a block
        preserves the original values
        returns a new vector with the mapped values
      with no block
        returns an Enumerator
    from a subclass
      returns an instance of the subclass
    on a large vector
      works

Immutable::Vector
  #marshal_dump/#marshal_load
    can survive dumping and loading into a new process
    is still possible to find items by index after loading

Immutable::Vector
  #max
    with a block
      on []
        returns nil
      on ["A"]
        returns "A"
      on ["Ichi", "Ni", "San"]
        returns "Ichi"
    without a block
      on []
        returns nil
      on ["A"]
        returns "A"
      on ["Ichi", "Ni", "San"]
        returns "San"

Immutable::Vector
  #min
    with a block
      on []
        returns nil
      on ["A"]
        returns "A"
      on ["Ichi", "Ni", "San"]
        returns "Ni"
    without a block
      on []
        returns nil
      on ["A"]
        returns "A"
      on ["Ichi", "Ni", "San"]
        returns "Ichi"

Immutable::Vector
  #*
    raises a TypeError if passed nil
    raises an ArgumentError if passed no arguments
    with a String argument
      acts just like #join
    with an Integer argument
      concatenates n copies of the array
      raises an ArgumentError if integer is negative
      works on large vectors
    with a subclass of Vector
      returns an instance of the subclass

Immutable::Vector
  .new
    accepts a single enumerable argument and creates a new vector
    makes a defensive copy of a non-frozen mutable Array passed in
    is amenable to overriding of #initialize
    from a subclass
      returns a frozen instance of the subclass
  .[]
    accepts a variable number of items and creates a new vector

Immutable::Vector
  #partition
    on []
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [1]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [1, 2]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [1, 2, 3]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [1, 2, 3, 4]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [2, 3, 4]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [3, 4]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator
    on [4]
      with a block
        preserves the original
        returns a frozen array with two items
        correctly identifies the matches
        correctly identifies the remainder
      without a block
        returns an Enumerator

Immutable::Vector
  #permutation
    handles duplicate elements correctly
    leaves the original unmodified
    behaves like Array#permutation
    without a block or arguments
      returns an Enumerator of all permutations
    without a block, but with integral argument
      returns an Enumerator of all permutations of given length
    with a block
      returns self
      and no argument
        yields all permutations
      and an integral argument
        yields all permutations of the given length
    on an empty vector
      yields the empty permutation
    with an argument of zero
      yields the empty permutation
    with a length greater than the size of the vector
      yields no permutations

Immutable::Vector
  #pop
    on []
      preserves the original
      returns []
    on ["A"]
      preserves the original
      returns []
    on ["A", "B", "C"]
      preserves the original
      returns ["A", "B"]
    on 1..32
      preserves the original
      returns 1..31
    on 1..33
      preserves the original
      returns 1..32

Immutable::Vector
  #product
    when passed no arguments
      multiplies all items in vector
    when passed one or more vectors
      when passed a block
        yields an array for each combination of items from the vectors
        returns self
      when not passed a block
        returns the cartesian product in an array
      when one of the arguments is empty
        returns an empty array
      when the receiver is empty
        returns an empty array
    when passed one or more Arrays
      also calculates the cartesian product correctly

Immutable::Vector
  #reduce
    on []
      with an initial value of 10
        and a block
          returns 10
    on [1]
      with an initial value of 10
        and a block
          returns 9
    on [1, 2, 3]
      with an initial value of 10
        and a block
          returns 4
    on []
      with no initial value
        and a block
          returns nil
    on [1]
      with no initial value
        and a block
          returns 1
    on [1, 2, 3]
      with no initial value
        and a block
          returns -4
    with no block and a symbol argument
      uses the symbol as the name of a method to reduce with
    with no block and a string argument
      uses the string as the name of a method to reduce with
  #inject
    on []
      with an initial value of 10
        and a block
          returns 10
    on [1]
      with an initial value of 10
        and a block
          returns 9
    on [1, 2, 3]
      with an initial value of 10
        and a block
          returns 4
    on []
      with no initial value
        and a block
          returns nil
    on [1]
      with no initial value
        and a block
          returns 1
    on [1, 2, 3]
      with no initial value
        and a block
          returns -4
    with no block and a symbol argument
      uses the symbol as the name of a method to reduce with
    with no block and a string argument
      uses the string as the name of a method to reduce with

Immutable::Vector
  #reject
    works with a variety of inputs
    on []
      with a block
        returns []
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns ["A"]
      without a block
        returns an Enumerator
    on ["A", "B", "C"]
      with a block
        returns ["A", "B", "C"]
      without a block
        returns an Enumerator
    on ["A", "b", "C"]
      with a block
        returns ["A", "C"]
      without a block
        returns an Enumerator
    on ["a", "b", "c"]
      with a block
        returns []
      without a block
        returns an Enumerator
  #delete_if
    works with a variety of inputs
    on []
      with a block
        returns []
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns ["A"]
      without a block
        returns an Enumerator
    on ["A", "B", "C"]
      with a block
        returns ["A", "B", "C"]
      without a block
        returns an Enumerator
    on ["A", "b", "C"]
      with a block
        returns ["A", "C"]
      without a block
        returns an Enumerator
    on ["a", "b", "c"]
      with a block
        returns []
      without a block
        returns an Enumerator

Immutable::Vector
  #repeated_combination
    leaves the original unmodified
    behaves like Array#repeated_combination
    with no block
      returns an Enumerator
    with a block
      returns self
    with a negative argument
      yields nothing and returns self
    with a zero argument
      yields an empty array
    with a argument of 1
      yields each item in the vector, as single-item vectors
    on an empty vector, with an argument greater than zero
      yields nothing
    with a positive argument, greater than 1
      yields all combinations of the given size (where a single element can appear more than once in a row)

Immutable::Vector
  #repeated_permutation
    handles duplicate elements correctly
    allows permutations larger than the number of elements
    leaves the original unmodified
    behaves like Array#repeated_permutation
    without a block
      and without argument
        returns an Enumerator of all repeated permutations
      with an integral argument
        returns an Enumerator of all repeated permutations of the given length
    with a block
      returns self
      on an empty vector
        yields the empty permutation
      with an argument of zero
        yields the empty permutation
      with no argument
        yields all repeated permutations
      with a positive integral argument
        yields all repeated permutations of the given length

Immutable::Vector
  #reverse_each
    on a 2-item vector
      with a block (internal iteration)
        returns self
        yields all items in the opposite order as #each
      with no block
        returns an Enumerator
    on a 31-item vector
      with a block (internal iteration)
        returns self
        yields all items in the opposite order as #each
      with no block
        returns an Enumerator
    on a 32-item vector
      with a block (internal iteration)
        returns self
        yields all items in the opposite order as #each
      with no block
        returns an Enumerator
    on a 33-item vector
      with a block (internal iteration)
        returns self
        yields all items in the opposite order as #each
      with no block
        returns an Enumerator
    on a 1000-item vector
      with a block (internal iteration)
        returns self
        yields all items in the opposite order as #each
      with no block
        returns an Enumerator
    on a 1024-item vector
      with a block (internal iteration)
        returns self
        yields all items in the opposite order as #each
      with no block
        returns an Enumerator
    on a 1025-item vector
      with a block (internal iteration)
        returns self
        yields all items in the opposite order as #each
      with no block
        returns an Enumerator
    on a 2000-item vector
      with a block (internal iteration)
        returns self
        yields all items in the opposite order as #each
      with no block
        returns an Enumerator

Immutable::Vector
  #reverse
    on []
      returns []
    on [1]
      returns [1]
    on [1, 2]
      returns [2, 1]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32]
      returns [32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33]
      returns [33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]
      returns [100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
    on [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, 892, 893, 894, 895, 896, 897, 898, 899, 900, 901, 902, 903, 904, 905, 906, 907, 908, 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024]
      returns [1024, 1023, 1022, 1021, 1020, 1019, 1018, 1017, 1016, 1015, 1014, 1013, 1012, 1011, 1010, 1009, 1008, 1007, 1006, 1005, 1004, 1003, 1002, 1001, 1000, 999, 998, 997, 996, 995, 994, 993, 992, 991, 990, 989, 988, 987, 986, 985, 984, 983, 982, 981, 980, 979, 978, 977, 976, 975, 974, 973, 972, 971, 970, 969, 968, 967, 966, 965, 964, 963, 962, 961, 960, 959, 958, 957, 956, 955, 954, 953, 952, 951, 950, 949, 948, 947, 946, 945, 944, 943, 942, 941, 940, 939, 938, 937, 936, 935, 934, 933, 932, 931, 930, 929, 928, 927, 926, 925, 924, 923, 922, 921, 920, 919, 918, 917, 916, 915, 914, 913, 912, 911, 910, 909, 908, 907, 906, 905, 904, 903, 902, 901, 900, 899, 898, 897, 896, 895, 894, 893, 892, 891, 890, 889, 888, 887, 886, 885, 884, 883, 882, 881, 880, 879, 878, 877, 876, 875, 874, 873, 872, 871, 870, 869, 868, 867, 866, 865, 864, 863, 862, 861, 860, 859, 858, 857, 856, 855, 854, 853, 852, 851, 850, 849, 848, 847, 846, 845, 844, 843, 842, 841, 840, 839, 838, 837, 836, 835, 834, 833, 832, 831, 830, 829, 828, 827, 826, 825, 824, 823, 822, 821, 820, 819, 818, 817, 816, 815, 814, 813, 812, 811, 810, 809, 808, 807, 806, 805, 804, 803, 802, 801, 800, 799, 798, 797, 796, 795, 794, 793, 792, 791, 790, 789, 788, 787, 786, 785, 784, 783, 782, 781, 780, 779, 778, 777, 776, 775, 774, 773, 772, 771, 770, 769, 768, 767, 766, 765, 764, 763, 762, 761, 760, 759, 758, 757, 756, 755, 754, 753, 752, 751, 750, 749, 748, 747, 746, 745, 744, 743, 742, 741, 740, 739, 738, 737, 736, 735, 734, 733, 732, 731, 730, 729, 728, 727, 726, 725, 724, 723, 722, 721, 720, 719, 718, 717, 716, 715, 714, 713, 712, 711, 710, 709, 708, 707, 706, 705, 704, 703, 702, 701, 700, 699, 698, 697, 696, 695, 694, 693, 692, 691, 690, 689, 688, 687, 686, 685, 684, 683, 682, 681, 680, 679, 678, 677, 676, 675, 674, 673, 672, 671, 670, 669, 668, 667, 666, 665, 664, 663, 662, 661, 660, 659, 658, 657, 656, 655, 654, 653, 652, 651, 650, 649, 648, 647, 646, 645, 644, 643, 642, 641, 640, 639, 638, 637, 636, 635, 634, 633, 632, 631, 630, 629, 628, 627, 626, 625, 624, 623, 622, 621, 620, 619, 618, 617, 616, 615, 614, 613, 612, 611, 610, 609, 608, 607, 606, 605, 604, 603, 602, 601, 600, 599, 598, 597, 596, 595, 594, 593, 592, 591, 590, 589, 588, 587, 586, 585, 584, 583, 582, 581, 580, 579, 578, 577, 576, 575, 574, 573, 572, 571, 570, 569, 568, 567, 566, 565, 564, 563, 562, 561, 560, 559, 558, 557, 556, 555, 554, 553, 552, 551, 550, 549, 548, 547, 546, 545, 544, 543, 542, 541, 540, 539, 538, 537, 536, 535, 534, 533, 532, 531, 530, 529, 528, 527, 526, 525, 524, 523, 522, 521, 520, 519, 518, 517, 516, 515, 514, 513, 512, 511, 510, 509, 508, 507, 506, 505, 504, 503, 502, 501, 500, 499, 498, 497, 496, 495, 494, 493, 492, 491, 490, 489, 488, 487, 486, 485, 484, 483, 482, 481, 480, 479, 478, 477, 476, 475, 474, 473, 472, 471, 470, 469, 468, 467, 466, 465, 464, 463, 462, 461, 460, 459, 458, 457, 456, 455, 454, 453, 452, 451, 450, 449, 448, 447, 446, 445, 444, 443, 442, 441, 440, 439, 438, 437, 436, 435, 434, 433, 432, 431, 430, 429, 428, 427, 426, 425, 424, 423, 422, 421, 420, 419, 418, 417, 416, 415, 414, 413, 412, 411, 410, 409, 408, 407, 406, 405, 404, 403, 402, 401, 400, 399, 398, 397, 396, 395, 394, 393, 392, 391, 390, 389, 388, 387, 386, 385, 384, 383, 382, 381, 380, 379, 378, 377, 376, 375, 374, 373, 372, 371, 370, 369, 368, 367, 366, 365, 364, 363, 362, 361, 360, 359, 358, 357, 356, 355, 354, 353, 352, 351, 350, 349, 348, 347, 346, 345, 344, 343, 342, 341, 340, 339, 338, 337, 336, 335, 334, 333, 332, 331, 330, 329, 328, 327, 326, 325, 324, 323, 322, 321, 320, 319, 318, 317, 316, 315, 314, 313, 312, 311, 310, 309, 308, 307, 306, 305, 304, 303, 302, 301, 300, 299, 298, 297, 296, 295, 294, 293, 292, 291, 290, 289, 288, 287, 286, 285, 284, 283, 282, 281, 280, 279, 278, 277, 276, 275, 274, 273, 272, 271, 270, 269, 268, 267, 266, 265, 264, 263, 262, 261, 260, 259, 258, 257, 256, 255, 254, 253, 252, 251, 250, 249, 248, 247, 246, 245, 244, 243, 242, 241, 240, 239, 238, 237, 236, 235, 234, 233, 232, 231, 230, 229, 228, 227, 226, 225, 224, 223, 222, 221, 220, 219, 218, 217, 216, 215, 214, 213, 212, 211, 210, 209, 208, 207, 206, 205, 204, 203, 202, 201, 200, 199, 198, 197, 196, 195, 194, 193, 192, 191, 190, 189, 188, 187, 186, 185, 184, 183, 182, 181, 180, 179, 178, 177, 176, 175, 174, 173, 172, 171, 170, 169, 168, 167, 166, 165, 164, 163, 162, 161, 160, 159, 158, 157, 156, 155, 154, 153, 152, 151, 150, 149, 148, 147, 146, 145, 144, 143, 142, 141, 140, 139, 138, 137, 136, 135, 134, 133, 132, 131, 130, 129, 128, 127, 126, 125, 124, 123, 122, 121, 120, 119, 118, 117, 116, 115, 114, 113, 112, 111, 110, 109, 108, 107, 106, 105, 104, 103, 102, 101, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

Immutable::Vector
  #rindex
    when passed an object present in the vector
      returns the last index where the object is present
    when passed an object not present in the vector
      returns nil
    with a block
      returns the last index of an object which the predicate is true for
    without an argument OR block
      returns an Enumerator

Immutable::Vector
  #rotate
    leaves the original unmodified
    when passed no argument
      returns a new vector with the first element moved to the end
    with an integral argument n
      returns a new vector with the first (n % size) elements moved to the end
    with a floating-point argument n
      coerces the argument to integer using to_int
    with a non-numeric argument
      raises a TypeError
    with an argument of zero
      returns self
    with an argument equal to the vector's size
      returns self
    on a 31-item vector
      behaves like Array#rotate
    on a 32-item vector
      behaves like Array#rotate
    on a 33-item vector
      behaves like Array#rotate
    on a 1000-item vector
      behaves like Array#rotate
    on a 1023-item vector
      behaves like Array#rotate
    on a 1024-item vector
      behaves like Array#rotate
    on a 1025-item vector
      behaves like Array#rotate
    from a subclass
      returns an instance of the subclass

Immutable::Vector
  #sample
    returns a randomly chosen item

Immutable::Vector
  #select
    works with a variety of inputs
    with a block
      preserves the original
      returns a vector with the matching values
    with no block
      returns an Enumerator
    when nothing matches
      preserves the original
      returns an empty vector
    on an empty vector
      returns self
    from a subclass
      returns an instance of the subclass
  #find_all
    works with a variety of inputs
    with a block
      preserves the original
      returns a vector with the matching values
    with no block
      returns an Enumerator
    when nothing matches
      preserves the original
      returns an empty vector
    on an empty vector
      returns self
    from a subclass
      returns an instance of the subclass

Immutable::Vector
  #set
    when empty
WARNING: Using the `raise_error` matcher without providing a specific error or message risks false positives, since `raise_error` will match when Ruby raises a `NoMethodError`, `NameError` or `ArgumentError`, potentially allowing the expectation to pass without even executing the method you are intending to call. Actual error raised was #<IndexError: index -1 outside of vector bounds>. Instead consider providing a specific error class or message. This message can be suppressed by setting: `RSpec::Expectations.configuration.on_potential_false_positives = :nothing`. Called from /build/reproducible-path/ruby-immutable-ruby-0.1.0/spec/lib/immutable/vector/set_spec.rb:11:in `block (4 levels) in <top (required)>'.
      raises an error for index -1
      allows indexes 0 and 1 to be set
    when not empty
      with a block
        and a positive index
          within the absolute bounds of the vector
            passes the current value to the block
            replaces the value with the result of the block
            supports to_proc methods
          just past the end of the vector
            passes nil to the block and adds a new value
          further outside the bounds of the vector
            passes nil to the block, fills up missing nils, and adds a new value
        and a negative index
          within the absolute bounds of the vector
            passes the current value to the block
            replaces the value with the result of the block
            supports to_proc methods
          outside the absolute bounds of the vector
WARNING: Using the `raise_error` matcher without providing a specific error or message risks false positives, since `raise_error` will match when Ruby raises a `NoMethodError`, `NameError` or `ArgumentError`, potentially allowing the expectation to pass without even executing the method you are intending to call. Actual error raised was #<IndexError: index -4 outside of vector bounds>. Instead consider providing a specific error class or message. This message can be suppressed by setting: `RSpec::Expectations.configuration.on_potential_false_positives = :nothing`. Called from /build/reproducible-path/ruby-immutable-ruby-0.1.0/spec/lib/immutable/vector/set_spec.rb:75:in `block (7 levels) in <top (required)>'.
            raises an error
      with a value
        and a positive index
          within the absolute bounds of the vector
            preserves the original
            sets the new value at the specified index
          just past the end of the vector
            adds a new value
          outside the absolute bounds of the vector
            fills up with nils
        with a negative index
          preserves the original
          sets the new value at the specified index
        outside the absolute bounds of the vector
WARNING: Using the `raise_error` matcher without providing a specific error or message risks false positives, since `raise_error` will match when Ruby raises a `NoMethodError`, `NameError` or `ArgumentError`, potentially allowing the expectation to pass without even executing the method you are intending to call. Actual error raised was #<IndexError: index -4 outside of vector bounds>. Instead consider providing a specific error class or message. This message can be suppressed by setting: `RSpec::Expectations.configuration.on_potential_false_positives = :nothing`. Called from /build/reproducible-path/ruby-immutable-ruby-0.1.0/spec/lib/immutable/vector/set_spec.rb:125:in `block (6 levels) in <top (required)>'.
          raises an error
    from a subclass
      returns an instance of the subclass
    on a 10-item vector
      works correctly
    on a 31-item vector
      works correctly
    on a 32-item vector
      works correctly
    on a 33-item vector
      works correctly
    on a 1000-item vector
      works correctly
    on a 1023-item vector
      works correctly
    on a 1024-item vector
      works correctly
    on a 1025-item vector
      works correctly
    on a 2000-item vector
      works correctly
    with an identical value to an existing item
      on a 1-item vector
        returns self
      on a 2-item vector
        returns self
      on a 5-item vector
        returns self
      on a 31-item vector
        returns self
      on a 32-item vector
        returns self
      on a 33-item vector
        returns self
      on a 100-item vector
        returns self
      on a 200-item vector
        returns self

Immutable::Vector
  #shift
    on []
      preserves the original
      returns []
    on ["A"]
      preserves the original
      returns []
    on ["A", "B", "C"]
      preserves the original
      returns ["B", "C"]
    on 1..31
      preserves the original
      returns 2..31
    on 1..32
      preserves the original
      returns 2..32
    on 1..33
      preserves the original
      returns 2..33

Immutable::Vector
  #shuffle
    returns the same values, in a usually different order
    leaves the original unchanged
    from a subclass
      returns an instance of the subclass
    on a 32-item vector
      works correctly
    on a 33-item vector
      works correctly
    on a 1023-item vector
      works correctly
    on a 1024-item vector
      works correctly
    on a 1025-item vector
      works correctly

Immutable::Vector
  #slice
    when passed a positive integral index
      returns the element at that index
      leaves the original unchanged
    when passed a negative integral index
      returns the element which is number (index.abs) counting from the end of the vector
    when passed a positive integral index and count
      returns 'count' elements starting from 'index'
      leaves the original unchanged
    when passed a negative integral index and count
      returns 'count' elements, starting from index which is number 'index.abs' counting from the end of the array
    when passed a Range
      returns the elements whose indexes are within the given Range
      leaves the original unchanged
  when passed a subclass of Range
    works the same as with a Range
  on a subclass of Vector
    with index and count or a range, returns an instance of the subclass
  #[]
    when passed a positive integral index
      returns the element at that index
      leaves the original unchanged
    when passed a negative integral index
      returns the element which is number (index.abs) counting from the end of the vector
    when passed a positive integral index and count
      returns 'count' elements starting from 'index'
      leaves the original unchanged
    when passed a negative integral index and count
      returns 'count' elements, starting from index which is number 'index.abs' counting from the end of the array
    when passed a Range
      returns the elements whose indexes are within the given Range
      leaves the original unchanged
  when passed a subclass of Range
    works the same as with a Range
  on a subclass of Vector
    with index and count or a range, returns an instance of the subclass

Immutable::Vector
  #sort
    on []
      with a block
        preserves the original
        returns []
      without a block
        preserves the original
        returns []
    on ["A"]
      with a block
        preserves the original
        returns ["A"]
      without a block
        preserves the original
        returns ["A"]
    on ["Ichi", "Ni", "San"]
      with a block
        preserves the original
        returns ["Ni", "San", "Ichi"]
      without a block
        preserves the original
        returns ["Ichi", "Ni", "San"]
    on a 10-item vector
      behaves like Arraysort
    on a 31-item vector
      behaves like Arraysort
    on a 32-item vector
      behaves like Arraysort
    on a 33-item vector
      behaves like Arraysort
    on a 1023-item vector
      behaves like Arraysort
    on a 1024-item vector
      behaves like Arraysort
    on a 1025-item vector
      behaves like Arraysort
  #sort_by
    on []
      with a block
        preserves the original
        returns []
      without a block
        preserves the original
        returns []
    on ["A"]
      with a block
        preserves the original
        returns ["A"]
      without a block
        preserves the original
        returns ["A"]
    on ["Ichi", "Ni", "San"]
      with a block
        preserves the original
        returns ["Ni", "San", "Ichi"]
      without a block
        preserves the original
        returns ["Ichi", "Ni", "San"]
    on a 10-item vector
      behaves like Arraysort_by
    on a 31-item vector
      behaves like Arraysort_by
    on a 32-item vector
      behaves like Arraysort_by
    on a 33-item vector
      behaves like Arraysort_by
    on a 1023-item vector
      behaves like Arraysort_by
    on a 1024-item vector
      behaves like Arraysort_by
    on a 1025-item vector
      behaves like Arraysort_by

Immutable::Vector
  #sum
    on []
      returns 0
    on [2]
      returns 2
    on [1, 3, 5, 7, 11]
      returns 27

Immutable::Vector
  #take
    10 from []
      preserves the original
      returns []
    10 from ["A"]
      preserves the original
      returns ["A"]
    0 from ["A", "B", "C"]
      preserves the original
      returns []
    2 from ["A", "B", "C"]
      preserves the original
      returns ["A", "B"]
    1 from 1..32
      preserves the original
      returns [1]
    32 from 1..33
      preserves the original
      returns 1..32
    40 from 1..100
      preserves the original
      returns 1..40
    when number of elements specified is identical to size
      returns self
    when number of elements specified is bigger than size
      returns self

Immutable::Vector
  #take_while
    on []
      with a block
        returns []
        preserves the original
      without a block
        returns an Enumerator
    on ["A"]
      with a block
        returns ["A"]
        preserves the original
      without a block
        returns an Enumerator
    on ["A", "B", "C"]
      with a block
        returns ["A", "B"]
        preserves the original
      without a block
        returns an Enumerator

Immutable::Vector
  #to_a
    with an empty vector
      returns the values
    with an single item vector
      returns the values
    with an multi-item vector
      returns the values
    with a 10-item vector
      returns the values
    with a 31-item vector
      returns the values
    with a 32-item vector
      returns the values
    with a 33-item vector
      returns the values
    with a 1000-item vector
      returns the values
    with a 1023-item vector
      returns the values
    with a 1024-item vector
      returns the values
    with a 1025-item vector
      returns the values

Immutable::Vector
  #to_ary
    converts using block parameters
    converts using method arguments
    converts using splat

Immutable::Vector
  #to_list
    on []
      returns a list
      the returned list
        has the correct length
        contains all values
    on ["A"]
      returns a list
      the returned list
        has the correct length
        contains all values
    on ["A", "B", "C"]
      returns a list
      the returned list
        has the correct length
        contains all values

Immutable::Vector
  #to_set
    on []
      returns a set with the same values
    on ["A"]
      returns a set with the same values
    on ["A", "B", "C"]
      returns a set with the same values
    on 1..10
      returns a set with the same values
    on 1..32
      returns a set with the same values
    on 1..33
      returns a set with the same values
    on 1..1000
      returns a set with the same values

Immutable::Vector
  #transpose
    takes a vector of vectors and transposes rows and columns
    raises an IndexError if the vectors are not of the same length
    also works on Vectors of Arrays
    on 10-item vectors
      behaves like Array#transpose
    on 31-item vectors
      behaves like Array#transpose
    on 32-item vectors
      behaves like Array#transpose
    on 33-item vectors
      behaves like Array#transpose
    on 1000-item vectors
      behaves like Array#transpose
    on 1023-item vectors
      behaves like Array#transpose
    on 1024-item vectors
      behaves like Array#transpose
    on 1025-item vectors
      behaves like Array#transpose
    on 2000-item vectors
      behaves like Array#transpose
    on a subclass of Vector
      returns instances of the subclass
    if an item does not respond to #size and #[]
      raises TypeError

Immutable::Vector
  #uniq
    returns a vector with no duplicates
    leaves the original unmodified
    uses #eql? semantics
    also uses #hash when determining which values are duplicates
    keeps the first of each group of duplicate values
    when passed a block
      uses the return value of the block to determine which items are duplicate
    on a vector with no duplicates
      returns an unchanged vector
      if the vector has more than 32 elements and is initialized with Vector.new
        returns an unchanged vector
    on a 10-item vector
      behaves like Array#uniq
    on a 31-item vector
      behaves like Array#uniq
    on a 32-item vector
      behaves like Array#uniq
    on a 33-item vector
      behaves like Array#uniq
    on a 1000-item vector
      behaves like Array#uniq
    on a 1023-item vector
      behaves like Array#uniq
    on a 1024-item vector
      behaves like Array#uniq
    on a 1025-item vector
      behaves like Array#uniq
    on a 2000-item vector
      behaves like Array#uniq
    from a subclass
      returns an instance of the subclass

Immutable::Vector
  #unshift
    on [] with "A"
      preserves the original
      returns ["A"]
    on ["A"] with "B"
      preserves the original
      returns ["B", "A"]
    on ["A"] with "A"
      preserves the original
      returns ["A", "A"]
    on ["A", "B", "C"] with "D"
      preserves the original
      returns ["D", "A", "B", "C"]
    on 1..31 with 0
      preserves the original
      returns 0..31
    on 1..32 with 0
      preserves the original
      returns 0..32
    on 1..33 with 0
      preserves the original
      returns 0..33

Immutable::Vector
  #update_in
    with one level on existing key
      passes the value to the block
      replaces the value with the result of the block
      should preserve the original
    with multi-level vectors on existing keys
      passes the value to the block
      replaces the value with the result of the block
      should preserve the original
    with multi-level creating sub-hashes when keys don't exist
      passes nil to the block
      creates subhashes on the way to set the value
    with multi-level including hash with existing keys
      passes the value to the block
      replaces the value with the result of the block
      should preserve the original
    with empty key_path
      raises ArguemntError

Immutable::Vector
  #values_at
    accepts any number of indices, and returns a vector of items at those indices
    when passed invalid indices
      fills in with nils
    when passed no arguments
      returns an empty vector
    from a subclass
      returns an instance of the subclass

Immutable::Vector
  #zip
    with a block
      yields arrays of one corresponding element from each input sequence
      fills in the missing values with nils
      returns nil
      can handle multiple inputs, of different classes
    without a block
      returns a vector of arrays (one corresponding element from each input sequence)
    on 10-item vectors
      behaves like Array#zip
    on 31-item vectors
      behaves like Array#zip
    on 32-item vectors
      behaves like Array#zip
    on 33-item vectors
      behaves like Array#zip
    on 1000-item vectors
      behaves like Array#zip
    on 1023-item vectors
      behaves like Array#zip
    on 1024-item vectors
      behaves like Array#zip
    on 1025-item vectors
      behaves like Array#zip
    from a subclass
      returns an instance of the subclass

Immutable
  Hash
    can be loaded separately
  Set
    can be loaded separately
  Vector
    can be loaded separately
  List
Ignoring debug-1.9.2 because its extensions are not built. Try: gem pristine debug --version 1.9.2
Ignoring racc-1.7.3 because its extensions are not built. Try: gem pristine racc --version 1.7.3
Ignoring rbs-3.4.0 because its extensions are not built. Try: gem pristine rbs --version 3.4.0
Ignoring rbtree-0.4.6 because its extensions are not built. Try: gem pristine rbtree --version 0.4.6
Ignoring sdbm-1.0.0 because its extensions are not built. Try: gem pristine sdbm --version 1.0.0
Ignoring debug-1.9.2 because its extensions are not built. Try: gem pristine debug --version 1.9.2
Ignoring racc-1.7.3 because its extensions are not built. Try: gem pristine racc --version 1.7.3
Ignoring rbs-3.4.0 because its extensions are not built. Try: gem pristine rbs --version 3.4.0
Ignoring rbtree-0.4.6 because its extensions are not built. Try: gem pristine rbtree --version 0.4.6
Ignoring sdbm-1.0.0 because its extensions are not built. Try: gem pristine sdbm --version 1.0.0
    can be loaded separately
  SortedSet
    can be loaded separately
  Deque
Ignoring debug-1.9.2 because its extensions are not built. Try: gem pristine debug --version 1.9.2
Ignoring racc-1.7.3 because its extensions are not built. Try: gem pristine racc --version 1.7.3
Ignoring rbs-3.4.0 because its extensions are not built. Try: gem pristine rbs --version 3.4.0
Ignoring rbtree-0.4.6 because its extensions are not built. Try: gem pristine rbtree --version 0.4.6
Ignoring sdbm-1.0.0 because its extensions are not built. Try: gem pristine sdbm --version 1.0.0
Ignoring debug-1.9.2 because its extensions are not built. Try: gem pristine debug --version 1.9.2
Ignoring racc-1.7.3 because its extensions are not built. Try: gem pristine racc --version 1.7.3
Ignoring rbs-3.4.0 because its extensions are not built. Try: gem pristine rbs --version 3.4.0
Ignoring rbtree-0.4.6 because its extensions are not built. Try: gem pristine rbtree --version 0.4.6
Ignoring sdbm-1.0.0 because its extensions are not built. Try: gem pristine sdbm --version 1.0.0
    can be loaded separately

Top 10 slowest examples (7.79 seconds, 32.0% of total time):
  Immutable::List#each_chunk on a really big list doesn't run out of stack
    1.42 seconds ./spec/lib/immutable/list/each_slice_spec.rb:7
  Immutable::List#each_slice on a really big list doesn't run out of stack
    1.26 seconds ./spec/lib/immutable/list/each_slice_spec.rb:7
  Immutable::List ensures each node of a lazy list will only be realized on ONE thread, even when accessed by multiple threads
    0.77067 seconds ./spec/lib/immutable/list/multithreading_spec.rb:5
  Immutable::Hash#size has the correct size after lots of addings and removings
    0.68769 seconds ./spec/lib/immutable/hash/size_spec.rb:38
  Immutable::List#all? on a really big list doesn't run out of stack
    0.65071 seconds ./spec/lib/immutable/list/all_spec.rb:8
  Immutable::List#eql? on a really big list doesn't run out of stack
    0.63132 seconds ./spec/lib/immutable/list/eql_spec.rb:6
  Immutable::List#partition calls the passed block only once for each item, even with multiple threads
    0.62574 seconds ./spec/lib/immutable/list/partition_spec.rb:38
  Immutable::List#hash on a really big list doesn't run out of stack
    0.6158 seconds ./spec/lib/immutable/list/hash_spec.rb:6
  Immutable::Set#select works on a large set, with many combinations of input
    0.57584 seconds ./spec/lib/immutable/set/select_spec.rb:59
  Immutable::Set#find_all works on a large set, with many combinations of input
    0.55128 seconds ./spec/lib/immutable/set/select_spec.rb:59

Top 10 slowest example groups:
  Immutable::Set
    0.39666 seconds average (0.79332 seconds / 2 examples) ./spec/lib/immutable/set/marshal_spec.rb:3
  Immutable::Deque
    0.36287 seconds average (0.72574 seconds / 2 examples) ./spec/lib/immutable/deque/marshal_spec.rb:3
  Immutable::Vector
    0.3554 seconds average (0.71079 seconds / 2 examples) ./spec/lib/immutable/vector/marshal_spec.rb:3
  Immutable::Hash
    0.34785 seconds average (0.6957 seconds / 2 examples) ./spec/lib/immutable/hash/marshal_spec.rb:3
  Immutable::List
    0.30028 seconds average (0.90085 seconds / 3 examples) ./spec/lib/immutable/list/multithreading_spec.rb:4
  Immutable
    0.24565 seconds average (1.47 seconds / 6 examples) ./spec/lib/load_spec.rb:6
  Immutable::SortedSet
    0.22323 seconds average (0.6697 seconds / 3 examples) ./spec/lib/immutable/sorted_set/marshal_spec.rb:3
  Immutable::List
    0.2121 seconds average (0.6363 seconds / 3 examples) ./spec/lib/immutable/list/hash_spec.rb:3
  Immutable::Hash
    0.14697 seconds average (1.47 seconds / 10 examples) ./spec/lib/immutable/hash/size_spec.rb:3
  Immutable::List
    0.08454 seconds average (2.71 seconds / 32 examples) ./spec/lib/immutable/list/each_slice_spec.rb:3

Finished in 24.36 seconds (files took 2.78 seconds to load)
4608 examples, 0 failures


┌──────────────────────────────────────────────────────────────────────────────┐
│ dh_ruby --install finished                                                   │
└──────────────────────────────────────────────────────────────────────────────┘

   dh_installdocs -O--buildsystem=ruby
   dh_ruby_fixdocs -O--buildsystem=ruby
   dh_installchangelogs -O--buildsystem=ruby
   dh_installsystemduser -O--buildsystem=ruby
   dh_perl -O--buildsystem=ruby
   dh_link -O--buildsystem=ruby
   dh_strip_nondeterminism -O--buildsystem=ruby
   dh_compress -X.rb -O--buildsystem=ruby
   dh_fixperms -O--buildsystem=ruby
   dh_missing -O--buildsystem=ruby
   dh_ruby_fixdepends -O--buildsystem=ruby
   dh_installdeb -O--buildsystem=ruby
   dh_gencontrol -O--buildsystem=ruby
dpkg-gencontrol: warning: Depends field of package ruby-immutable-ruby: substitution variable ${shlibs:Depends} used, but is not defined
   dh_md5sums -O--buildsystem=ruby
   dh_builddeb -O--buildsystem=ruby
dpkg-deb: building package 'ruby-immutable-ruby' in '../ruby-immutable-ruby_0.1.0-2_all.deb'.
 dpkg-genbuildinfo --build=binary -O../ruby-immutable-ruby_0.1.0-2_i386.buildinfo
 dpkg-genchanges --build=binary -O../ruby-immutable-ruby_0.1.0-2_i386.changes
dpkg-genchanges: info: binary-only upload (no source code included)
 dpkg-source --after-build .
dpkg-buildpackage: info: binary-only upload (no source included)
dpkg-genchanges: info: not including original source code in upload
I: copying local configuration
I: unmounting dev/ptmx filesystem
I: unmounting dev/pts filesystem
I: unmounting dev/shm filesystem
I: unmounting proc filesystem
I: unmounting sys filesystem
I: cleaning the build env 
I: removing directory /srv/workspace/pbuilder/14570 and its subdirectories
I: Current time: Sat Feb  8 18:38:33 -12 2025
I: pbuilder-time-stamp: 1739083113
Sun Feb  9 06:38:35 UTC 2025  I: 1st build successful. Starting 2nd build on remote node ionos16-i386.debian.net.
Sun Feb  9 06:38:35 UTC 2025  I: Preparing to do remote build '2' on ionos16-i386.debian.net.
Sun Feb  9 06:39:56 UTC 2025  I: Deleting $TMPDIR on ionos16-i386.debian.net.
Sun Feb  9 06:39:56 UTC 2025  I: ruby-immutable-ruby_0.1.0-2_i386.changes:
Format: 1.8
Date: Sun, 17 Sep 2023 16:13:08 -0400
Source: ruby-immutable-ruby
Binary: ruby-immutable-ruby
Architecture: all
Version: 0.1.0-2
Distribution: unstable
Urgency: medium
Maintainer: Debian Ruby Team <pkg-ruby-extras-maintainers@lists.alioth.debian.org>
Changed-By: Jeremy Bícha <jbicha@ubuntu.com>
Description:
 ruby-immutable-ruby - efficient, immutable, thread-safe collection classes for Ruby
Changes:
 ruby-immutable-ruby (0.1.0-2) unstable; urgency=medium
 .
   * Team upload
   * Source-only upload
Checksums-Sha1:
 1efb49dd3095c0953bb541c97d71f6edb0b050ad 46240 ruby-immutable-ruby_0.1.0-2_all.deb
 e5f5fdbdf183c16654f6c77faeee4092070b59b7 8454 ruby-immutable-ruby_0.1.0-2_i386.buildinfo
Checksums-Sha256:
 a465b692c8ef55f7b45b52f7295532e9009d8a8e7ef3b57051607bff76248e12 46240 ruby-immutable-ruby_0.1.0-2_all.deb
 ed5965e566e742cfa592d51e77f687634b84413b1a77e2e0df03f774a28416d0 8454 ruby-immutable-ruby_0.1.0-2_i386.buildinfo
Files:
 7fe0d876f9a39302bc3358029983cd0f 46240 ruby optional ruby-immutable-ruby_0.1.0-2_all.deb
 c16c2090acbe2f28dc3443eb49162bc8 8454 ruby optional ruby-immutable-ruby_0.1.0-2_i386.buildinfo
Sun Feb  9 06:39:58 UTC 2025  I: diffoscope 288 will be used to compare the two builds:
Running as unit: rb-diffoscope-i386_7-56469.service
# Profiling output for: /usr/bin/diffoscope --timeout 7200 --html /srv/reproducible-results/rbuild-debian/r-b-build.sj0KDSdd/ruby-immutable-ruby_0.1.0-2.diffoscope.html --text /srv/reproducible-results/rbuild-debian/r-b-build.sj0KDSdd/ruby-immutable-ruby_0.1.0-2.diffoscope.txt --json /srv/reproducible-results/rbuild-debian/r-b-build.sj0KDSdd/ruby-immutable-ruby_0.1.0-2.diffoscope.json --profile=- /srv/reproducible-results/rbuild-debian/r-b-build.sj0KDSdd/b1/ruby-immutable-ruby_0.1.0-2_i386.changes /srv/reproducible-results/rbuild-debian/r-b-build.sj0KDSdd/b2/ruby-immutable-ruby_0.1.0-2_i386.changes

## command (total time: 0.000s)
       0.000s      1 call     cmp (internal)

## has_same_content_as (total time: 0.000s)
       0.000s      1 call     diffoscope.comparators.binary.FilesystemFile

## main (total time: 0.003s)
       0.003s      2 calls    outputs
       0.000s      1 call     cleanup
Finished with result: success
Main processes terminated with: code=exited/status=0
Service runtime: 237ms
CPU time consumed: 231ms
Sun Feb  9 06:39:58 UTC 2025  I: diffoscope 288 found no differences in the changes files, and a .buildinfo file also exists.
Sun Feb  9 06:39:58 UTC 2025  I: ruby-immutable-ruby from trixie built successfully and reproducibly on i386.
Sun Feb  9 06:39:59 UTC 2025  I: Submitting .buildinfo files to external archives:
Sun Feb  9 06:39:59 UTC 2025  I: Submitting 12K	b1/ruby-immutable-ruby_0.1.0-2_i386.buildinfo.asc
Sun Feb  9 06:40:00 UTC 2025  I: Submitting 12K	b2/ruby-immutable-ruby_0.1.0-2_i386.buildinfo.asc
Sun Feb  9 06:40:01 UTC 2025  I: Done submitting .buildinfo files to http://buildinfo.debian.net/api/submit.
Sun Feb  9 06:40:01 UTC 2025  I: Done submitting .buildinfo files.
Sun Feb  9 06:40:01 UTC 2025  I: Removing signed ruby-immutable-ruby_0.1.0-2_i386.buildinfo.asc files:
removed './b1/ruby-immutable-ruby_0.1.0-2_i386.buildinfo.asc'
removed './b2/ruby-immutable-ruby_0.1.0-2_i386.buildinfo.asc'