starting phase `set-SOURCE-DATE-EPOCH'
phase `set-SOURCE-DATE-EPOCH' succeeded after 0.0 seconds
starting phase `set-paths'
environment variable `PATH' set to `/gnu/store/wkx81yc5zfxrrwpamg6s4z2v6m3a7m4q-ruby-2.7.4/bin:/gnu/store/ch68x8gcsibgw9g75afqs836jmd0919l-bundler-2.1.4/bin:/gnu/store/sqby45jw1w6963l81gkz2jahlkm2lbny-ruby-yard-0.9.25/bin:/gnu/store/vffvncn7d149shc7c2znx2ia7mg30d8j-tar-1.34/bin:/gnu/store/bdwsnfq7y20cwzxd5xdipz2lqndcniv2-gzip-1.10/bin:/gnu/store/hq8w61vwbjgr7kkwdfvcr9wgdf7i7pyf-bzip2-1.0.8/bin:/gnu/store/3bmnfqz1a46ddl89iqcargdf2ximijxs-xz-5.2.5/bin:/gnu/store/q4g6nw26jlg61018xhjn575nzc975wh3-file-5.39/bin:/gnu/store/gzl6fga809pi6x0mncgh4hl97xcrai2v-diffutils-3.8/bin:/gnu/store/d8nk495685457rpmdf6a46278zijc4mf-patch-2.7.6/bin:/gnu/store/5sr7igkcclqyz01g0q3f2gsc5y5lg7am-findutils-4.8.0/bin:/gnu/store/z42b5grcygvc8rxp3638qhkjv1410b4d-gawk-5.1.0/bin:/gnu/store/axhn2x0d98gj3fmrlc06d5j1vn715ray-sed-4.8/bin:/gnu/store/f4kp7yaiqp9imxf2r9lm3kzs35cwfsc8-grep-3.6/bin:/gnu/store/kvpvk5wh70wdbjnr83hh85rg22ysxm9h-coreutils-8.32/bin:/gnu/store/74aw9c2yfpgbwac78c5jddhk2lf03958-make-4.3/bin:/gnu/store/lzf5zg0diw2bhh2qji4bl2v46wd8pylc-bash-minimal-5.1.8/bin:/gnu/store/1khybib025zzd3hjqkaw8bf909ccbq2b-ld-wrapper-0/bin:/gnu/store/0cwwi9fdd1xx0pn0xxk4xya6wdhliyds-binutils-2.37/bin:/gnu/store/dbcbcaxq20kbkhh2mr8k98qfnymq22kp-gcc-10.3.0/bin:/gnu/store/gfjp8gfv4xxschbaxvldpigadfwqazhw-glibc-2.33/bin:/gnu/store/gfjp8gfv4xxschbaxvldpigadfwqazhw-glibc-2.33/sbin:/gnu/store/lz68phlisvc36x3jcrny6wairb27a2h1-ruby-rspec-core-3.8.0/bin:/gnu/store/wqkp4gaa6pi2la6dm5lxcjfjdpr3jjxl-ruby-rack-2.2.3/bin:/gnu/store/8pdfzhm26nvrj09iqq1rs15mpygdmaw4-ruby-diff-lcs-1.3/bin'
environment variable `GEM_PATH' set to `/gnu/store/wkx81yc5zfxrrwpamg6s4z2v6m3a7m4q-ruby-2.7.4/lib/ruby/vendor_ruby:/gnu/store/ajwb1ak23r1l7l3h57p9hkzn774qn8nb-ruby-rspec-3.8.0/lib/ruby/vendor_ruby:/gnu/store/ch68x8gcsibgw9g75afqs836jmd0919l-bundler-2.1.4/lib/ruby/vendor_ruby:/gnu/store/1vqgzik26y6x143izmn2lg2giqjg084y-ruby-idn-ruby-0.1.0/lib/ruby/vendor_ruby:/gnu/store/vzz7d48fwiwrzdn2kjyrrwr51jijrqsa-ruby-sporkmonger-rack-mount-0.8.3-1.076aa2c/lib/ruby/vendor_ruby:/gnu/store/jvhpdssbwlp61pra25hay824sz4naqir-ruby-rspec-its-1.3.0/lib/ruby/vendor_ruby:/gnu/store/sqby45jw1w6963l81gkz2jahlkm2lbny-ruby-yard-0.9.25/lib/ruby/vendor_ruby:/gnu/store/3pjl2h6jgr9vj73icpphszdrxkv65syg-ruby-simplecov-0.17.1/lib/ruby/vendor_ruby:/gnu/store/fx6w0wr5vmlp1g3z667ccln1g9kwqsja-ruby-public-suffix-4.0.5/lib/ruby/vendor_ruby:/gnu/store/whwb9fmnkrycw98yw5pp04jx163s4iaq-ruby-rspec-expectations-3.8.2/lib/ruby/vendor_ruby:/gnu/store/0850hvifykj4lr37vaqdhqkvqq056qm3-ruby-rspec-mocks-3.8.0/lib/ruby/vendor_ruby:/gnu/store/lz68phlisvc36x3jcrny6wairb27a2h1-ruby-rspec-core-3.8.0/lib/ruby/vendor_ruby:/gnu/store/wqkp4gaa6pi2la6dm5lxcjfjdpr3jjxl-ruby-rack-2.2.3/lib/ruby/vendor_ruby:/gnu/store/zn6f8inhmlw6m2vqlfnn6zkjafwl6jc8-ruby-simplecov-html-0.10.2/lib/ruby/vendor_ruby:/gnu/store/j3z7lhdcrvy6x8gbi5mvn2rsmrxpxr5b-ruby-docile-1.1.5/lib/ruby/vendor_ruby:/gnu/store/xkwk76dmnm8a8g3w32jiv2wj927wajrw-ruby-json-2.1.0/lib/ruby/vendor_ruby:/gnu/store/8pdfzhm26nvrj09iqq1rs15mpygdmaw4-ruby-diff-lcs-1.3/lib/ruby/vendor_ruby:/gnu/store/rc2q9qgx5gbjj7ncnnchmw36y5y275zs-ruby-rspec-support-3.8.0/lib/ruby/vendor_ruby'
environment variable `BASH_LOADABLES_PATH' unset
environment variable `C_INCLUDE_PATH' set to `/gnu/store/wkx81yc5zfxrrwpamg6s4z2v6m3a7m4q-ruby-2.7.4/include:/gnu/store/hq8w61vwbjgr7kkwdfvcr9wgdf7i7pyf-bzip2-1.0.8/include:/gnu/store/3bmnfqz1a46ddl89iqcargdf2ximijxs-xz-5.2.5/include:/gnu/store/q4g6nw26jlg61018xhjn575nzc975wh3-file-5.39/include:/gnu/store/z42b5grcygvc8rxp3638qhkjv1410b4d-gawk-5.1.0/include:/gnu/store/74aw9c2yfpgbwac78c5jddhk2lf03958-make-4.3/include:/gnu/store/0cwwi9fdd1xx0pn0xxk4xya6wdhliyds-binutils-2.37/include:/gnu/store/dbcbcaxq20kbkhh2mr8k98qfnymq22kp-gcc-10.3.0/include:/gnu/store/gfjp8gfv4xxschbaxvldpigadfwqazhw-glibc-2.33/include:/gnu/store/yir33hnhnb331lz2wp0l1q97yhbxgc41-zlib-1.2.11/include:/gnu/store/gm5mbaxkqhzafwy0wnimrg53j884glxn-linux-libre-headers-5.10.35/include'
environment variable `CPLUS_INCLUDE_PATH' set to `/gnu/store/wkx81yc5zfxrrwpamg6s4z2v6m3a7m4q-ruby-2.7.4/include:/gnu/store/hq8w61vwbjgr7kkwdfvcr9wgdf7i7pyf-bzip2-1.0.8/include:/gnu/store/3bmnfqz1a46ddl89iqcargdf2ximijxs-xz-5.2.5/include:/gnu/store/q4g6nw26jlg61018xhjn575nzc975wh3-file-5.39/include:/gnu/store/z42b5grcygvc8rxp3638qhkjv1410b4d-gawk-5.1.0/include:/gnu/store/74aw9c2yfpgbwac78c5jddhk2lf03958-make-4.3/include:/gnu/store/0cwwi9fdd1xx0pn0xxk4xya6wdhliyds-binutils-2.37/include:/gnu/store/dbcbcaxq20kbkhh2mr8k98qfnymq22kp-gcc-10.3.0/include/c++:/gnu/store/dbcbcaxq20kbkhh2mr8k98qfnymq22kp-gcc-10.3.0/include:/gnu/store/gfjp8gfv4xxschbaxvldpigadfwqazhw-glibc-2.33/include:/gnu/store/yir33hnhnb331lz2wp0l1q97yhbxgc41-zlib-1.2.11/include:/gnu/store/gm5mbaxkqhzafwy0wnimrg53j884glxn-linux-libre-headers-5.10.35/include'
environment variable `LIBRARY_PATH' set to `/gnu/store/wkx81yc5zfxrrwpamg6s4z2v6m3a7m4q-ruby-2.7.4/lib:/gnu/store/ajwb1ak23r1l7l3h57p9hkzn774qn8nb-ruby-rspec-3.8.0/lib:/gnu/store/ch68x8gcsibgw9g75afqs836jmd0919l-bundler-2.1.4/lib:/gnu/store/1vqgzik26y6x143izmn2lg2giqjg084y-ruby-idn-ruby-0.1.0/lib:/gnu/store/vzz7d48fwiwrzdn2kjyrrwr51jijrqsa-ruby-sporkmonger-rack-mount-0.8.3-1.076aa2c/lib:/gnu/store/jvhpdssbwlp61pra25hay824sz4naqir-ruby-rspec-its-1.3.0/lib:/gnu/store/sqby45jw1w6963l81gkz2jahlkm2lbny-ruby-yard-0.9.25/lib:/gnu/store/3pjl2h6jgr9vj73icpphszdrxkv65syg-ruby-simplecov-0.17.1/lib:/gnu/store/fx6w0wr5vmlp1g3z667ccln1g9kwqsja-ruby-public-suffix-4.0.5/lib:/gnu/store/hq8w61vwbjgr7kkwdfvcr9wgdf7i7pyf-bzip2-1.0.8/lib:/gnu/store/3bmnfqz1a46ddl89iqcargdf2ximijxs-xz-5.2.5/lib:/gnu/store/q4g6nw26jlg61018xhjn575nzc975wh3-file-5.39/lib:/gnu/store/z42b5grcygvc8rxp3638qhkjv1410b4d-gawk-5.1.0/lib:/gnu/store/0cwwi9fdd1xx0pn0xxk4xya6wdhliyds-binutils-2.37/lib:/gnu/store/gfjp8gfv4xxschbaxvldpigadfwqazhw-glibc-2.33/lib:/gnu/store/4yb66zp717gb7hc5a1q4lkxhami93d4b-glibc-2.33-static/lib:/gnu/store/akml58i0q8mikg7xf6hm789mzlijpm5j-glibc-utf8-locales-2.33/lib:/gnu/store/yir33hnhnb331lz2wp0l1q97yhbxgc41-zlib-1.2.11/lib:/gnu/store/whwb9fmnkrycw98yw5pp04jx163s4iaq-ruby-rspec-expectations-3.8.2/lib:/gnu/store/0850hvifykj4lr37vaqdhqkvqq056qm3-ruby-rspec-mocks-3.8.0/lib:/gnu/store/lz68phlisvc36x3jcrny6wairb27a2h1-ruby-rspec-core-3.8.0/lib:/gnu/store/wqkp4gaa6pi2la6dm5lxcjfjdpr3jjxl-ruby-rack-2.2.3/lib:/gnu/store/zn6f8inhmlw6m2vqlfnn6zkjafwl6jc8-ruby-simplecov-html-0.10.2/lib:/gnu/store/j3z7lhdcrvy6x8gbi5mvn2rsmrxpxr5b-ruby-docile-1.1.5/lib:/gnu/store/xkwk76dmnm8a8g3w32jiv2wj927wajrw-ruby-json-2.1.0/lib:/gnu/store/8pdfzhm26nvrj09iqq1rs15mpygdmaw4-ruby-diff-lcs-1.3/lib:/gnu/store/rc2q9qgx5gbjj7ncnnchmw36y5y275zs-ruby-rspec-support-3.8.0/lib'
environment variable `GUIX_LOCPATH' set to `/gnu/store/akml58i0q8mikg7xf6hm789mzlijpm5j-glibc-utf8-locales-2.33/lib/locale'
phase `set-paths' succeeded after 0.0 seconds
starting phase `install-locale'
using 'en_US.utf8' locale for category "LC_ALL"
phase `install-locale' succeeded after 0.0 seconds
starting phase `unpack'
Unpacked gem: '/tmp/guix-build-ruby-addressable-2.7.0.drv-0/2qb0zgmlihfjxaj5kcx3diyby0ym86sc-addressable-2.7.0'
phase `unpack' succeeded after 0.5 seconds
starting phase `remove-unnecessary-dependencies-from-Gemfile'
phase `remove-unnecessary-dependencies-from-Gemfile' succeeded after 0.0 seconds
starting phase `patch-usr-bin-file'
phase `patch-usr-bin-file' succeeded after 0.0 seconds
starting phase `patch-source-shebangs'
phase `patch-source-shebangs' succeeded after 0.0 seconds
starting phase `patch-generated-file-shebangs'
phase `patch-generated-file-shebangs' succeeded after 0.0 seconds
starting phase `extract-gemspec'
phase `extract-gemspec' succeeded after 0.4 seconds
starting phase `replace-git-ls-files'
phase `replace-git-ls-files' succeeded after 0.0 seconds
starting phase `build'
  Successfully built RubyGem
  Name: addressable
  Version: 2.7.0
  File: addressable-2.7.0.gem
phase `build' succeeded after 0.6 seconds
starting phase `delete-network-dependent-test'
phase `delete-network-dependent-test' succeeded after 0.0 seconds
starting phase `check'
NOTE: Gem::Specification#has_rdoc= is deprecated with no replacement. It will be removed on or after 2018-12-01.
Gem::Specification#has_rdoc= called from tasks/gem.rake:14.
/gnu/store/wkx81yc5zfxrrwpamg6s4z2v6m3a7m4q-ruby-2.7.4/bin/ruby -I/gnu/store/rc2q9qgx5gbjj7ncnnchmw36y5y275zs-ruby-rspec-support-3.8.0/lib/ruby/vendor_ruby/gems/rspec-support-3.8.0/lib:/gnu/store/lz68phlisvc36x3jcrny6wairb27a2h1-ruby-rspec-core-3.8.0/lib/ruby/vendor_ruby/gems/rspec-core-3.8.0/lib /gnu/store/lz68phlisvc36x3jcrny6wairb27a2h1-ruby-rspec-core-3.8.0/lib/ruby/vendor_ruby/gems/rspec-core-3.8.0/exe/rspec spec/addressable/idna_spec.rb spec/addressable/rack_mount_compat_spec.rb spec/addressable/security_spec.rb spec/addressable/template_spec.rb spec/addressable/uri_spec.rb --color --format documentation
warning: coveralls gem not found; skipping Coveralls
Could not load native IDN implementation.

Addressable::IDNA when using the pure-Ruby implementation
  should not blow up inside fibers
  it should behave like converting from unicode to ASCII
    should convert 'www.google.com' correctly
    should convert 'AcinusFallumTrompetumNullunCreditumVisumEstAtCuadLongumEtCefallum.com' correctly
    should convert 'www.詹姆斯.com' correctly
    should convert 'www.Iñtërnâtiônàlizætiøn.com' correctly
    should convert 'www.Iñtërnâtiônàlizætiøn.com' correctly
    should convert 'www.ほんとうにながいわけのわからないどめいんめいのらべるまだながくしないとたりない.w3.mag.keio.ac.jp' correctly
    should convert 'www.ほんとうにながいわけのわからないどめいんめいのらべるまだながくしないとたりない.w3.mag.keio.ac.jp' correctly
    should convert '点心和烤鸭.w3.mag.keio.ac.jp' correctly
    should convert '가각갂갃간갅갆갇갈갉힢힣.com' correctly
    should convert '碼標準萬國碼.com' correctly
    should convert 'リ宠퐱〹.com' correctly
    should convert 'リ宠퐱卄.com' correctly
    should convert 'ᆵ' correctly
    should convert 'ᆵ' correctly
    should convert '🌹🌹🌹.ws' correctly
    should handle two adjacent '.'s correctly
  it should behave like converting from ASCII to unicode
    should convert 'AcinusFallumTrompetumNullunCreditumVisumEstAtCuadLongumEtCefallum.com' correctly
    should return the identity conversion when punycode decode fails
    should return the identity conversion when the ACE prefix has no suffix
    should convert 'www.google.com' correctly
    should convert 'www.詹姆斯.com' correctly
    should convert '詹姆斯.com' correctly
    should convert 'www.iñtërnâtiônàlizætiøn.com' correctly
    should convert 'iñtërnâtiônàlizætiøn.com' correctly
    should convert 'www.ほんとうにながいわけのわからないどめいんめいのらべるまだながくしないとたりない.w3.mag.keio.ac.jp' correctly
    should convert '点心和烤鸭.w3.mag.keio.ac.jp' correctly
    should convert '가각갂갃간갅갆갇갈갉힢힣.com' correctly
    should convert '碼標準萬國碼.com' correctly
    should convert 'リ宠퐱卄.com' correctly
    should convert 'ᆵ' correctly
    should convert '🌹🌹🌹.ws' correctly
    should handle two adjacent '.'s correctly
    should normalize 'string' correctly

Rack::Mount
  should generate from routes with Addressable::Template
  should generate from routes with Addressable::Template using defaults
  should recognize routes with Addressable::Template
  should generate from routes with Addressable::Template
  should generate from routes with Addressable::Template using defaults
  should recognize routes with Addressable::Template
  should recognize routes with derived Regexp

Addressable::URI when created with a URI known to cause crashes in certain browsers
  should parse correctly
  should parse correctly as a full URI

Addressable::URI when created with a URI known to cause crashes in certain browsers
  should parse correctly
  should parse correctly as a full URI

eql?
  is equal when the pattern matches
  is not equal when the pattern differs
  is not equal to non-templates

==
  is equal when the pattern matches
  is not equal when the pattern differs
  is not equal to non-templates

Type conversion
  behaves like expands
    {var} to true
    {hello} to 1234
    {nothing} to
    {sym} to symbolic
    {decimal} to 0.1e1

Level 1:
  behaves like expands
    {var} to value
    {hello} to Hello%20World%21

Level 2
  Operator +:
    behaves like expands
      {+var} to value
      {+hello} to Hello%20World!
      {+path}/here to /foo/bar/here
      here?ref={+path} to here?ref=/foo/bar
  Operator #:
    behaves like expands
      X{#var} to X#value
      X{#hello} to X#Hello%20World!

Level 3
  Operator nil (multiple vars):
    behaves like expands
      map?{x,y} to map?1024,768
      {x,hello,y} to 1024,Hello%20World%21,768
  Operator + (multiple vars):
    behaves like expands
      {+x,hello,y} to 1024,Hello%20World!,768
      {+path,x}/here to /foo/bar,1024/here
  Operator # (multiple vars):
    behaves like expands
      {#x,hello,y} to #1024,Hello%20World!,768
      {#path,x}/here to #/foo/bar,1024/here
  Operator .
    behaves like expands
      X{.var} to X.value
      X{.x,y} to X.1024.768
  Operator /
    behaves like expands
      {/var} to /value
      {/var,x}/here to /value/1024/here
  Operator ;
    behaves like expands
      {;x,y} to ;x=1024;y=768
      {;x,y,empty} to ;x=1024;y=768;empty
  Operator ?
    behaves like expands
      {?x,y} to ?x=1024&y=768
      {?x,y,empty} to ?x=1024&y=768&empty=
  Operator &
    behaves like expands
      ?fixed=yes{&x} to ?fixed=yes&x=1024
      {&x,y,empty} to &x=1024&y=768&empty=

Level 4
  Expansion with value modifiers
    behaves like expands
      {var:3} to val
      {var:30} to value
      {list} to red,green,blue
      {list*} to red,green,blue
      {keys} to semi,%3B,dot,.,comma,%2C
      {keys*} to semi=%3B,dot=.,comma=%2C
  Operator + with value modifiers
    behaves like expands
      {+path:6}/here to /foo/b/here
      {+list} to red,green,blue
      {+list*} to red,green,blue
      {+keys} to semi,;,dot,.,comma,,
      {+keys*} to semi=;,dot=.,comma=,
  Operator # with value modifiers
    behaves like expands
      {#path:6}/here to #/foo/b/here
      {#list} to #red,green,blue
      {#list*} to #red,green,blue
      {#keys} to #semi,;,dot,.,comma,,
      {#keys*} to #semi=;,dot=.,comma=,
  Operator . with value modifiers
    behaves like expands
      X{.var:3} to X.val
      X{.list} to X.red,green,blue
      X{.list*} to X.red.green.blue
      X{.keys} to X.semi,%3B,dot,.,comma,%2C
      X{.keys*} to X.semi=%3B.dot=..comma=%2C
  Operator / with value modifiers
    behaves like expands
      {/var:1,var} to /v/value
      {/list} to /red,green,blue
      {/list*} to /red/green/blue
      {/list*,path:4} to /red/green/blue/%2Ffoo
      {/keys} to /semi,%3B,dot,.,comma,%2C
      {/keys*} to /semi=%3B/dot=./comma=%2C
  Operator ; with value modifiers
    behaves like expands
      {;hello:5} to ;hello=Hello
      {;list} to ;list=red,green,blue
      {;list*} to ;list=red;list=green;list=blue
      {;keys} to ;keys=semi,%3B,dot,.,comma,%2C
      {;keys*} to ;semi=%3B;dot=.;comma=%2C
  Operator ? with value modifiers
    behaves like expands
      {?var:3} to ?var=val
      {?list} to ?list=red,green,blue
      {?list*} to ?list=red&list=green&list=blue
      {?keys} to ?keys=semi,%3B,dot,.,comma,%2C
      {?keys*} to ?semi=%3B&dot=.&comma=%2C
  Operator & with value modifiers
    behaves like expands
      {&var:3} to &var=val
      {&list} to &list=red,green,blue
      {&list*} to &list=red&list=green&list=blue
      {&keys} to &keys=semi,%3B,dot,.,comma,%2C
      {&keys*} to &semi=%3B&dot=.&comma=%2C

Modifiers
  length
    behaves like expands
      {var:3} to val
      {var:30} to value
      {var} to value
      {semi} to %3B
      {semi:2} to %3B
  explode
    behaves like expands
      find{?year*} to find?year=1965&year=2000&year=2012
      www{.dom*} to www.example.com

Expansion
  concatenation
    behaves like expands
      {count} to one,two,three
      {count*} to one,two,three
      {/count} to /one,two,three
      {/count*} to /one/two/three
      {;count} to ;count=one,two,three
      {;count*} to ;count=one;count=two;count=three
      {?count} to ?count=one,two,three
      {?count*} to ?count=one&count=two&count=three
      {&count*} to &count=one&count=two&count=three
  simple expansion
    behaves like expands
      {var} to value
      {hello} to Hello%20World%21
      {half} to 50%25
      O{empty}X to OX
      O{undef}X to OX
      {x,y} to 1024,768
      {x,hello,y} to 1024,Hello%20World%21,768
      ?{x,empty} to ?1024,
      ?{x,undef} to ?1024
      ?{undef,y} to ?768
      {var:3} to val
      {var:30} to value
      {list} to red,green,blue
      {list*} to red,green,blue
      {keys} to semi,%3B,dot,.,comma,%2C
      {keys*} to semi=%3B,dot=.,comma=%2C
  reserved expansion (+)
    behaves like expands
      {+var} to value
      {+hello} to Hello%20World!
      {+half} to 50%25
      {base}index to http%3A%2F%2Fexample.com%2Fhome%2Findex
      {+base}index to http://example.com/home/index
      O{+empty}X to OX
      O{+undef}X to OX
      {+path}/here to /foo/bar/here
      here?ref={+path} to here?ref=/foo/bar
      up{+path}{var}/here to up/foo/barvalue/here
      {+x,hello,y} to 1024,Hello%20World!,768
      {+path,x}/here to /foo/bar,1024/here
      {+path:6}/here to /foo/b/here
      {+list} to red,green,blue
      {+list*} to red,green,blue
      {+keys} to semi,;,dot,.,comma,,
      {+keys*} to semi=;,dot=.,comma=,
  fragment expansion (#)
    behaves like expands
      {#var} to #value
      {#hello} to #Hello%20World!
      {#half} to #50%25
      foo{#empty} to foo#
      foo{#undef} to foo
      {#x,hello,y} to #1024,Hello%20World!,768
      {#path,x}/here to #/foo/bar,1024/here
      {#path:6}/here to #/foo/b/here
      {#list} to #red,green,blue
      {#list*} to #red,green,blue
      {#keys} to #semi,;,dot,.,comma,,
      {#keys*} to #semi=;,dot=.,comma=,
  label expansion (.)
    behaves like expands
      {.who} to .fred
      {.who,who} to .fred.fred
      {.half,who} to .50%25.fred
      www{.dom*} to www.example.com
      X{.var} to X.value
      X{.empty} to X.
      X{.undef} to X
      X{.var:3} to X.val
      X{.list} to X.red,green,blue
      X{.list*} to X.red.green.blue
      X{.keys} to X.semi,%3B,dot,.,comma,%2C
      X{.keys*} to X.semi=%3B.dot=..comma=%2C
      X{.empty_keys} to X
      X{.empty_keys*} to X
  path expansion (/)
    behaves like expands
      {/who} to /fred
      {/who,who} to /fred/fred
      {/half,who} to /50%25/fred
      {/who,dub} to /fred/me%2Ftoo
      {/var} to /value
      {/var,empty} to /value/
      {/var,undef} to /value
      {/var,x}/here to /value/1024/here
      {/var:1,var} to /v/value
      {/list} to /red,green,blue
      {/list*} to /red/green/blue
      {/list*,path:4} to /red/green/blue/%2Ffoo
      {/keys} to /semi,%3B,dot,.,comma,%2C
      {/keys*} to /semi=%3B/dot=./comma=%2C
  path-style expansion (;)
    behaves like expands
      {;who} to ;who=fred
      {;half} to ;half=50%25
      {;empty} to ;empty
      {;v,empty,who} to ;v=6;empty;who=fred
      {;v,bar,who} to ;v=6;who=fred
      {;x,y} to ;x=1024;y=768
      {;x,y,empty} to ;x=1024;y=768;empty
      {;x,y,undef} to ;x=1024;y=768
      {;hello:5} to ;hello=Hello
      {;list} to ;list=red,green,blue
      {;list*} to ;list=red;list=green;list=blue
      {;keys} to ;keys=semi,%3B,dot,.,comma,%2C
      {;keys*} to ;semi=%3B;dot=.;comma=%2C
  form query expansion (?)
    behaves like expands
      {?who} to ?who=fred
      {?half} to ?half=50%25
      {?x,y} to ?x=1024&y=768
      {?x,y,empty} to ?x=1024&y=768&empty=
      {?x,y,undef} to ?x=1024&y=768
      {?var:3} to ?var=val
      {?list} to ?list=red,green,blue
      {?list*} to ?list=red&list=green&list=blue
      {?keys} to ?keys=semi,%3B,dot,.,comma,%2C
      {?keys*} to ?semi=%3B&dot=.&comma=%2C
  form query expansion (&)
    behaves like expands
      {&who} to &who=fred
      {&half} to &half=50%25
      ?fixed=yes{&x} to ?fixed=yes&x=1024
      {&x,y,empty} to &x=1024&y=768&empty=
      {&x,y,undef} to &x=1024&y=768
      {&var:3} to &var=val
      {&list} to &list=red,green,blue
      {&list*} to &list=red&list=green&list=blue
      {&keys} to &keys=semi,%3B,dot,.,comma,%2C
      {&keys*} to &semi=%3B&dot=.&comma=%2C
  non-string key in match data
    raises TypeError

Addressable::Template
  initialize
    with a non-string
      raises a TypeError
  freeze
    freezes the template
  Matching
    first uri with ExampleTwoProcessor
      variables
        should == ["query"]
      captures
        should == ["an example search query"]
    second uri with ExampleTwoProcessor
      variables
        should == ["first", "second"]
      captures
        should == ["a", "b/c"]
    second uri with DumbProcessor
      variables
        should == ["first", "second"]
      captures
        should == ["a", "b/c"]
    second uri
      variables
        should == ["first", "second"]
      captures
        should == ["a", ["b", "c"]]
    third uri
      variables
        should == ["hash", "first"]
      captures
        should == [{"a"=>"1", "b"=>"2", "c"=>"3", "first"=>"foo"}, nil]
    fourth uri
      variables
        should == ["hash", "first"]
      captures
        should == [{"a"=>"1", "b"=>"2", "c"=>"3", "first"=>"foo"}, nil]
    fifth uri
      variables
        should == ["path", "hash", "first"]
      captures
        should == ["foo", nil, nil]
  match
    when the URI is the same as the template
      returns the match data itself with an empty mapping
  extract
    should be able to extract with queries
    should be able to extract without queries
    issue #137
      can match empty
      can match first var
      can match second var
      can match both vars
  Partial expand with symbols
    partial_expand with two simple values
      builds a new pattern
    partial_expand query with missing param in middle
      builds a new pattern
    partial_expand form style query with missing param at beginning
      builds a new pattern
    issue #307 - partial_expand form query with nil params
      builds a new pattern with two=nil
      builds a new pattern with one=nil and two=nil
      builds a new pattern with one=1 and two=nil
      builds a new pattern with one=nil and two=2
      builds a new pattern with one=nil
    partial_expand with query string
      builds a new pattern
    partial_expand with path operator
      builds a new pattern
    partial expand with unicode values
      normalizes unicode by default
      does not normalize unicode when byte semantics requested
  Partial expand with strings
    partial_expand with two simple values
      builds a new pattern
    partial_expand query with missing param in middle
      builds a new pattern
    partial_expand with query string
      builds a new pattern
    partial_expand with path operator
      builds a new pattern
  Expand
    expand with unicode values
      normalizes unicode by default
      does not normalize unicode when byte semantics requested
    expand with a processor
      processes spaces
      validates
    partial_expand query with missing param in middle
      builds a new pattern
    partial_expand with query string
      builds a new pattern
    partial_expand with path operator
      builds a new pattern
  Matching with operators
    Level 1:
      can match
      can fail
      can match empty
      lists vars
    Level 2:
      can match
      can match empty level 2 #
      can match empty level 2 +
      lists vars
    Level 3:
      no operator
        can match
        lists vars
      + operator
        can match
        lists vars
      . operator
        can match
        lists vars
      / operator
        can match
        lists vars
      ; operator
        can match
        lists vars
      ? operator
        test
          can match
          lists vars
        issue #137
          can match empty
          can match first var
          can match second var
          can match both vars
        issue #71
          can match
          lists vars
      & operator
        can match
        lists vars
  support regexes:
    EXPRESSION
      should be able to match an expression
      should fail on non vars
    VARNAME
      should be able to match a variable
      should fail on non vars
    VARIABLE_LIST
      should be able to match a variable list
      should fail on non vars
    VARSPEC
      should be able to match a variable with modifier
      should fail on non vars

Addressable::Template::MatchData
  uri
    should == #<Addressable::URI:0x2828 URI:ab/cd>
  template
    should == #<Addressable::Template:0x283c PATTERN:{foo}/{bar}>
  mapping
    should == {"bar"=>"cd", "foo"=>"ab"}
  variables
    should == ["foo", "bar"]
  keys
    should == ["foo", "bar"]
  names
    should == ["foo", "bar"]
  values
    should == ["ab", "cd"]
  captures
    should == ["ab", "cd"]
  to_a
    should == ["ab/cd", "ab", "cd"]
  to_s
    should == "ab/cd"
  string
    should == "ab/cd"
  pre_match
    should == ""
  post_match
    should == ""
  values_at
    returns an array with the values
    allows mixing integer an string keys
    accepts unknown keys
  []
    string key
      returns the corresponding capture
      returns nil for unknown keys
    symbol key
      returns the corresponding capture
      returns nil for unknown keys
    integer key
      returns the full URI for index 0
      returns the corresponding capture
      returns nil for unknown keys
    other key
      raises an exception
    with length
      returns an array starting at index with given length

Addressable::URI when created with a non-numeric port number
  should raise an error

Addressable::URI when created with a invalid encoded port number
  should raise an error

Addressable::URI when created with a non-string scheme
  should raise an error

Addressable::URI when created with a non-string user
  should raise an error

Addressable::URI when created with a non-string password
  should raise an error

Addressable::URI when created with a non-string userinfo
  should raise an error

Addressable::URI when created with a non-string host
  should raise an error

Addressable::URI when created with a non-string authority
  should raise an error

Addressable::URI when created with a non-string path
  should raise an error

Addressable::URI when created with a non-string query
  should raise an error

Addressable::URI when created with a non-string fragment
  should raise an error

Addressable::URI when created with a scheme but no hierarchical segment
  should raise an error

Addressable::URI quote handling
  in host name
    should raise an error for single quote

Addressable::URI newline normalization
  should not accept newlines in scheme
  should not unescape newline in path
  should not unescape newline in hostname
  should not unescape newline in username
  should not unescape newline in username
  should not accept newline in hostname

Addressable::URI when created with ambiguous path
  should raise an error

Addressable::URI when created with an invalid host
  should raise an error

Addressable::URI when created with a host consisting of sub-delims characters
  should not raise an error

Addressable::URI when created with a host consisting of unreserved characters
  should not raise an error

Addressable::URI when created from nil components
  should have a nil site value
  should have an empty path
  should be an empty uri
  should have a nil default port
  should be empty
  should raise an error if the scheme is set to whitespace
  should raise an error if the scheme is set to all digits
  should raise an error if the scheme begins with a digit
  should raise an error if the scheme begins with a plus
  should raise an error if the scheme begins with a dot
  should raise an error if the scheme begins with a dash
  should raise an error if the scheme contains an illegal character
  should raise an error if the scheme contains whitespace
  should raise an error if the scheme contains a newline
  should raise an error if set into an invalid state
  should raise an error if set into an invalid state
  should raise an error if set into an invalid state
  should raise an error if set into an invalid state

Addressable::URI when initialized from individual components
  returns 'http' for #scheme
  returns 'http' for #normalized_scheme
  returns 'user' for #user
  returns 'user' for #normalized_user
  returns 'password' for #password
  returns 'password' for #normalized_password
  returns 'user:password' for #userinfo
  returns 'user:password' for #normalized_userinfo
  returns 'example.com' for #host
  returns 'example.com' for #normalized_host
  returns 'com' for #tld
  returns 'user:password@example.com:8080' for #authority
  returns 'user:password@example.com:8080' for #normalized_authority
  returns 8080 for #port
  returns 8080 for #normalized_port
  returns 80 for #default_port
  returns 'http://user:password@example.com:8080' for #site
  returns 'http://user:password@example.com:8080' for #normalized_site
  returns '/path' for #path
  returns '/path' for #normalized_path
  returns 'query=value' for #query
  returns 'query=value' for #normalized_query
  returns 'fragment' for #fragment
  returns 'fragment' for #normalized_fragment
  returns #hash
  returns #to_s
  should not be empty
  should not be frozen
  should allow destructive operations

Addressable::URI when initialized from frozen individual components
  returns 'http' for #scheme
  returns 'http' for #normalized_scheme
  returns 'user' for #user
  returns 'user' for #normalized_user
  returns 'password' for #password
  returns 'password' for #normalized_password
  returns 'user:password' for #userinfo
  returns 'user:password' for #normalized_userinfo
  returns 'example.com' for #host
  returns 'example.com' for #normalized_host
  returns 'user:password@example.com:8080' for #authority
  returns 'user:password@example.com:8080' for #normalized_authority
  returns 8080 for #port
  returns 8080 for #normalized_port
  returns 80 for #default_port
  returns 'http://user:password@example.com:8080' for #site
  returns 'http://user:password@example.com:8080' for #normalized_site
  returns '/path' for #path
  returns '/path' for #normalized_path
  returns 'query=value' for #query
  returns 'query=value' for #normalized_query
  returns 'fragment' for #fragment
  returns 'fragment' for #normalized_fragment
  returns #hash
  returns #to_s
  should not be empty
  should not be frozen
  should allow destructive operations

Addressable::URI when parsed from a frozen string
  returns 'http' for #scheme
  returns 'http' for #normalized_scheme
  returns 'user' for #user
  returns 'user' for #normalized_user
  returns 'password' for #password
  returns 'password' for #normalized_password
  returns 'user:password' for #userinfo
  returns 'user:password' for #normalized_userinfo
  returns 'example.com' for #host
  returns 'example.com' for #normalized_host
  returns 'user:password@example.com:8080' for #authority
  returns 'user:password@example.com:8080' for #normalized_authority
  returns 8080 for #port
  returns 8080 for #normalized_port
  returns 80 for #default_port
  returns 'http://user:password@example.com:8080' for #site
  returns 'http://user:password@example.com:8080' for #normalized_site
  returns '/path' for #path
  returns '/path' for #normalized_path
  returns 'query=value' for #query
  returns 'query=value' for #normalized_query
  returns 'fragment' for #fragment
  returns 'fragment' for #normalized_fragment
  returns #hash
  returns #to_s
  should not be empty
  should not be frozen
  should allow destructive operations

Addressable::URI when frozen
  returns nil for #scheme
  returns nil for #normalized_scheme
  returns nil for #user
  returns nil for #normalized_user
  returns nil for #password
  returns nil for #normalized_password
  returns nil for #userinfo
  returns nil for #normalized_userinfo
  returns nil for #host
  returns nil for #normalized_host
  returns nil for #authority
  returns nil for #normalized_authority
  returns nil for #port
  returns nil for #normalized_port
  returns nil for #default_port
  returns nil for #site
  returns nil for #normalized_site
  returns '' for #path
  returns '' for #normalized_path
  returns nil for #query
  returns nil for #normalized_query
  returns nil for #fragment
  returns nil for #normalized_fragment
  returns #hash
  returns #to_s
  should be empty
  should be frozen
  should not be frozen after duping
  should not allow destructive operations

Addressable::URI when frozen
  returns 'HTTP' for #scheme
  returns 'http' for #normalized_scheme
  returns nil for #user
  returns nil for #normalized_user
  returns nil for #password
  returns nil for #normalized_password
  returns nil for #userinfo
  returns nil for #normalized_userinfo
  returns 'example.com.' for #host
  returns nil for #normalized_host
  returns 'example.com.:80' for #authority
  returns 'example.com:80' for #normalized_authority
  returns 80 for #port
  returns nil for #normalized_port
  returns 80 for #default_port
  returns 'HTTP://example.com.:80' for #site
  returns 'http://example.com' for #normalized_site
  returns '/%70a%74%68' for #path
  returns '/path' for #normalized_path
  returns 'a=%31' for #query
  returns 'a=1' for #normalized_query
  returns '/%70a%74%68?a=%31' for #request_uri
  returns '1%323' for #fragment
  returns '123' for #normalized_fragment
  returns #hash
  returns #to_s
  should not be empty
  should be frozen
  should not be frozen after duping
  should not allow destructive operations

Addressable::URI when created from string components
  should have a site value of 'http://example.com'
  should be equal to the equivalent parsed URI
  should raise an error if invalid components omitted

Addressable::URI when created with a nil host but non-nil authority components
  should raise an error

Addressable::URI when created with both an authority and a user
  should raise an error

Addressable::URI when created with an authority and no port
  should not infer a port
  should have a site value of '//user@example.com'
  should have a 'null' origin

Addressable::URI when created with a host with trailing dots
  should have a stable normalized form

Addressable::URI when created with a host with a backslash
  should raise an error

Addressable::URI when created with a host with a slash
  should raise an error

Addressable::URI when created with a host with a space
  should raise an error

Addressable::URI when created with both a userinfo and a user
  should raise an error

Addressable::URI when created with a path that hasn't been prefixed with a '/' but a host specified
  should prefix a '/' to the path
  should have a site value of 'http://example.com'
  should have an origin of 'http://example.com

Addressable::URI when created with a path that hasn't been prefixed with a '/' but no host specified
  should not prefix a '/' to the path
  should have a site value of 'http:'
  should have a 'null' origin

Addressable::URI when parsed from an Addressable::URI object
  should not have unexpected side-effects
  should not have unexpected side-effects
  should not have unexpected side-effects
  should not have unexpected side-effects

Addressable::URI when parsed from something that looks like a URI object
  should parse without error

Addressable::URI when parsed from a standard library URI object
  should parse without error

Addressable::URI when parsed from ''
  should have no scheme
  should not be considered to be ip-based
  should have a path of ''
  should have a request URI of '/'
  should be considered relative
  should be considered to be in normal form
  should have a 'null' origin

Addressable::URI when parsed from 'ftp://ftp.is.co.za/rfc/rfc1808.txt'
  should use the 'ftp' scheme
  should be considered to be ip-based
  should have a host of 'ftp.is.co.za'
  should have inferred_port of 21
  should have a path of '/rfc/rfc1808.txt'
  should not have a request URI
  should be considered to be in normal form
  should have an origin of 'ftp://ftp.is.co.za'

Addressable::URI when parsed from 'http://www.ietf.org/rfc/rfc2396.txt'
  should use the 'http' scheme
  should be considered to be ip-based
  should have a host of 'www.ietf.org'
  should have inferred_port of 80
  should have a path of '/rfc/rfc2396.txt'
  should have a request URI of '/rfc/rfc2396.txt'
  should be considered to be in normal form
  should correctly omit components
  should correctly omit components destructively
  should have an origin of 'http://www.ietf.org'

Addressable::URI when parsed from 'ldap://[2001:db8::7]/c=GB?objectClass?one'
  should use the 'ldap' scheme
  should be considered to be ip-based
  should have a host of '[2001:db8::7]'
  should have inferred_port of 389
  should have a path of '/c=GB'
  should not have a request URI
  should not allow request URI assignment
  should have a query of 'objectClass?one'
  should be considered to be in normal form
  should correctly omit components
  should correctly omit components destructively
  should raise an error if omission would create an invalid URI
  should have an origin of 'ldap://[2001:db8::7]'

Addressable::URI when parsed from 'mailto:John.Doe@example.com'
  should use the 'mailto' scheme
  should not be considered to be ip-based
  should not have an inferred_port
  should have a path of 'John.Doe@example.com'
  should not have a request URI
  should be considered to be in normal form
  should have a 'null' origin

Addressable::URI when parsed from 'mailto:?to=addr1@an.example,addr2@an.example'
  should use the 'mailto' scheme
  should not be considered to be ip-based
  should not have an inferred_port
  should have a path of ''
  should not have a request URI
  should have the To: field value parameterized
  should be considered to be in normal form
  should have a 'null' origin

Addressable::URI when parsed from 'news:comp.infosystems.www.servers.unix'
  should use the 'news' scheme
  should not have an inferred_port
  should not be considered to be ip-based
  should have a path of 'comp.infosystems.www.servers.unix'
  should not have a request URI
  should be considered to be in normal form
  should have a 'null' origin

Addressable::URI when parsed from 'tel:+1-816-555-1212'
  should use the 'tel' scheme
  should not be considered to be ip-based
  should not have an inferred_port
  should have a path of '+1-816-555-1212'
  should not have a request URI
  should be considered to be in normal form
  should have a 'null' origin

Addressable::URI when parsed from 'telnet://192.0.2.16:80/'
  should use the 'telnet' scheme
  should have a host of '192.0.2.16'
  should have a port of 80
  should have a inferred_port of 80
  should have a default_port of 23
  should be considered to be ip-based
  should have a path of '/'
  should not have a request URI
  should be considered to be in normal form
  should have an origin of 'telnet://192.0.2.16:80'

Addressable::URI when parsed from 'urn:oasis:names:specification:docbook:dtd:xml:4.1.2'
  should use the 'urn' scheme
  should not have an inferred_port
  should not be considered to be ip-based
  should have a path of 'oasis:names:specification:docbook:dtd:xml:4.1.2'
  should not have a request URI
  should be considered to be in normal form
  should have a 'null' origin

Addressable::URI when heuristically parsed from '192.0.2.16:8000/path'
  should use the 'http' scheme
  should have a host of '192.0.2.16'
  should have a port of '8000'
  should be considered to be ip-based
  should have a path of '/path'
  should be considered to be in normal form
  should have an origin of 'http://192.0.2.16:8000'

Addressable::URI when parsed from 'http://example.com'
  when inspected, should have the correct URI
  when inspected, should have the correct class name
  when inspected, should have the correct object id
  should use the 'http' scheme
  should be considered to be ip-based
  should have an authority segment of 'example.com'
  should have a host of 'example.com'
  should be considered ip-based
  should have no username
  should have no password
  should use port 80
  should not have a specified port
  should have an empty path
  should have no query string
  should have a request URI of '/'
  should have no fragment
  should be considered absolute
  should not be considered relative
  should not be exactly equal to 42
  should not be equal to 42
  should not be roughly equal to 42
  should be exactly equal to http://example.com
  should be roughly equal to http://example.com/
  should be roughly equal to the string 'http://example.com/'
  should not be roughly equal to the string 'http://example.com:bogus/'
  should result in itself when joined with itself
  should be equivalent to http://EXAMPLE.com
  should be equivalent to http://EXAMPLE.com:80/
  should have the same hash as http://example.com
  should have the same hash as http://EXAMPLE.com after assignment
  should have a different hash from http://EXAMPLE.com
  should not allow origin assignment without scheme
  should not allow origin assignment without host
  should not allow origin assignment with bogus type
  should be equivalent to http://example.com/
  should be equivalent to http://example.com:/
  should be equivalent to http://example.com:80/
  should be equivalent to http://EXAMPLE.COM/
  should have a route of '/path/' to 'http://example.com/path/'
  should have a route of '..' from 'http://example.com/path/'
  should have a route of '#' to 'http://example.com/'
  should have a route of 'http://elsewhere.com/' to 'http://elsewhere.com/'
  when joined with 'relative/path' should be 'http://example.com/relative/path'
  when joined with a bogus object a TypeError should be raised
  should have the correct username after assignment
  should have the correct username after assignment
  should have the correct password after assignment
  should have the correct password after assignment
  should have the correct user/pass after repeated assignment
  should have the correct user/pass after userinfo assignment
  should correctly convert to a hash
  should be identical to its duplicate
  should have an origin of 'http://example.com'

Addressable::URI when parsed from 'HTTP://www.w3.org/pub/WWW/TheProject.html'
  should have the correct request URI
  should have the correct request URI after assignment
  should have the correct request URI after assignment
  should have the correct request URI after assignment
  should have the correct request URI after assignment
  should raise an error if the site value is set to something bogus
  should raise an error if the request URI is set to something bogus
  should correctly convert to a hash
  should have an origin of 'http://www.w3.org'

Addressable::URI when parsing IPv6 addresses
  should not raise an error for 'http://[3ffe:1900:4545:3:200:f8ff:fe21:67cf]/'
  should not raise an error for 'http://[fe80:0:0:0:200:f8ff:fe21:67cf]/'
  should not raise an error for 'http://[fe80::200:f8ff:fe21:67cf]/'
  should not raise an error for 'http://[::1]/'
  should not raise an error for 'http://[fe80::1]/'
  should raise an error for 'http://[<invalid>]/'

Addressable::URI when parsing IPv6 address
  host
    should == "[3ffe:1900:4545:3:200:f8ff:fe21:67cf]"
  hostname
    should == "3ffe:1900:4545:3:200:f8ff:fe21:67cf"

Addressable::URI when assigning IPv6 address
  should allow to set bare IPv6 address as hostname
  should allow to set bare IPv6 address as hostname with IPAddr object
  should not allow to set bare IPv6 address as host (PENDING: not checked)

Addressable::URI when parsing IPvFuture addresses
  should not raise an error for 'http://[v9.3ffe:1900:4545:3:200:f8ff:fe21:67cf]/'
  should not raise an error for 'http://[vff.fe80:0:0:0:200:f8ff:fe21:67cf]/'
  should not raise an error for 'http://[v12.fe80::200:f8ff:fe21:67cf]/'
  should not raise an error for 'http://[va0.::1]/'
  should not raise an error for 'http://[v255.fe80::1]/'
  should raise an error for 'http://[v0.<invalid>]/'

Addressable::URI when parsed from 'http://example.com/'
  should be equivalent to http://example.com
  should be equivalent to HTTP://example.com/
  should be equivalent to http://example.com:/
  should be equivalent to http://example.com:80/
  should be equivalent to http://Example.com/
  should have the correct username after assignment
  should have the correct password after assignment
  should have a request URI of '/'
  should correctly convert to a hash
  should be identical to its duplicate
  should have the same hash as its duplicate
  should have a different hash from its equivalent String value
  should have the same hash as an equal URI
  should be equivalent to http://EXAMPLE.com
  should be equivalent to http://EXAMPLE.com:80/
  should have the same hash as http://example.com/
  should have the same hash as http://example.com after assignment
  should have the same hash as http://example.com/? after assignment
  should have the same hash as http://example.com/? after assignment
  should have the same hash as http://example.com/# after assignment
  should have a different hash from http://example.com
  should have an origin of 'http://example.com'

Addressable::URI when parsed from 'http://example.com?#'
  should correctly convert to a hash
  should have a request URI of '/?'
  should normalize to 'http://example.com/'
  should have an origin of 'http://example.com'

Addressable::URI when parsed from 'http://@example.com/'
  should be equivalent to http://example.com
  should correctly convert to a hash
  should be identical to its duplicate
  should have an origin of 'http://example.com'

Addressable::URI when parsed from 'http://example.com./'
  should be equivalent to http://example.com
  should not be considered to be in normal form
  should be identical to its duplicate
  should have an origin of 'http://example.com'

Addressable::URI when parsed from 'http://:@example.com/'
  should be equivalent to http://example.com
  should correctly convert to a hash
  should be identical to its duplicate
  should have an origin of 'http://example.com'

Addressable::URI when parsed from 'HTTP://EXAMPLE.COM/'
  should be equivalent to http://example.com
  should correctly convert to a hash
  should be identical to its duplicate
  should have an origin of 'http://example.com'
  should have a tld of 'com'

Addressable::URI when parsed from 'http://www.example.co.uk/'
  should have an origin of 'http://www.example.co.uk'
  should have a tld of 'co.uk'
  should have a domain of 'example.co.uk'

Addressable::URI when parsed from 'http://sub_domain.blogspot.com/'
  should have an origin of 'http://sub_domain.blogspot.com'
  should have a tld of 'com'
  should have a domain of 'blogspot.com'

Addressable::URI when parsed from 'http://example.com/~smith/'
  should be equivalent to http://example.com/%7Esmith/
  should be equivalent to http://example.com/%7esmith/
  should be identical to its duplicate

Addressable::URI when parsed from 'http://example.com/%E8'
  should not raise an exception when normalized
  should be considered to be in normal form
  should not change if encoded with the normalizing algorithm

Addressable::URI when parsed from 'http://example.com/path%2Fsegment/'
  should be considered to be in normal form
  should be equal to 'http://example.com/path%2Fsegment/'
  should not be equal to 'http://example.com/path/segment/'
  should not be equal to 'http://example.com/path/segment/'

Addressable::URI when parsed from 'http://example.com/?%F6'
  should not raise an exception when normalized
  should be considered to be in normal form
  should not change if encoded with the normalizing algorithm

Addressable::URI when parsed from 'http://example.com/#%F6'
  should not raise an exception when normalized
  should be considered to be in normal form
  should not change if encoded with the normalizing algorithm

Addressable::URI when parsed from 'http://example.com/%C3%87'
  should be equivalent to 'http://example.com/C%CC%A7'
  should not change if encoded with the normalizing algorithm
  should raise an error if encoding with an unexpected return type
  if percent encoded should be 'http://example.com/C%25CC%25A7'
  if percent encoded should be 'http://example.com/C%25CC%25A7'
  should raise an error if encoding with an unexpected return type
  should be identical to its duplicate

Addressable::URI when parsed from 'http://example.com/?q=string'
  should use the 'http' scheme
  should have an authority segment of 'example.com'
  should have a host of 'example.com'
  should have no username
  should have no password
  should use port 80
  should have a path of '/'
  should have a query string of 'q=string'
  should have no fragment
  should be considered absolute
  should not be considered relative
  should be considered to be in normal form
  should be identical to its duplicate

Addressable::URI when parsed from 'http://example.com:80/'
  should use the 'http' scheme
  should have an authority segment of 'example.com:80'
  should have a host of 'example.com'
  should have no username
  should have no password
  should use port 80
  should have explicit port 80
  should have a path of '/'
  should have no query string
  should have no fragment
  should be considered absolute
  should not be considered relative
  should be exactly equal to http://example.com:80/
  should be roughly equal to http://example.com/
  should be roughly equal to the string 'http://example.com/'
  should not be roughly equal to the string 'http://example.com:bogus/'
  should result in itself when joined with itself
  should be equal to http://example.com/
  should be equal to http://example.com:/
  should be equal to http://example.com:80/
  should be equal to http://EXAMPLE.COM/
  should correctly convert to a hash
  should be identical to its duplicate
  should have an origin of 'http://example.com'
  should not change if encoded with the normalizing algorithm

Addressable::URI when parsed from 'http://example.com:8080/'
  should use the 'http' scheme
  should have an authority segment of 'example.com:8080'
  should have a host of 'example.com'
  should have no username
  should have no password
  should use port 8080
  should have explicit port 8080
  should have default port 80
  should have a path of '/'
  should have no query string
  should have no fragment
  should be considered absolute
  should not be considered relative
  should be exactly equal to http://example.com:8080/
  should have a route of 'http://example.com:8080/' from 'http://example.com/path/to/'
  should have a route of 'http://example.com:8080/' from 'http://example.com:80/path/to/'
  should have a route of '../../' from 'http://example.com:8080/path/to/'
  should have a route of 'http://example.com:8080/' from 'http://user:pass@example.com/path/to/'
  should correctly convert to a hash
  should be identical to its duplicate
  should have an origin of 'http://example.com:8080'
  should not change if encoded with the normalizing algorithm

Addressable::URI when parsed from 'http://example.com:%38%30/'
  should have the correct port
  should not be considered to be in normal form
  should normalize to 'http://example.com/'
  should have an origin of 'http://example.com'

Addressable::URI when parsed from 'http://example.com/%2E/'
  should be considered to be in normal form (PENDING: path segment normalization should happen before percent escaping normalization)
  should normalize to 'http://example.com/%2E/' (PENDING: path segment normalization should happen before percent escaping normalization)

Addressable::URI when parsed from 'http://example.com/..'
  should have the correct port
  should not be considered to be in normal form
  should normalize to 'http://example.com/'

Addressable::URI when parsed from 'http://example.com/../..'
  should have the correct port
  should not be considered to be in normal form
  should normalize to 'http://example.com/'

Addressable::URI when parsed from 'http://example.com/path(/..'
  should have the correct port
  should not be considered to be in normal form
  should normalize to 'http://example.com/'

Addressable::URI when parsed from 'http://example.com/(path)/..'
  should have the correct port
  should not be considered to be in normal form
  should normalize to 'http://example.com/'

Addressable::URI when parsed from 'http://example.com/path(/../'
  should have the correct port
  should not be considered to be in normal form
  should normalize to 'http://example.com/'

Addressable::URI when parsed from 'http://example.com/(path)/../'
  should have the correct port
  should not be considered to be in normal form
  should normalize to 'http://example.com/'

Addressable::URI when parsed from '/..//example.com'
  should become invalid when normalized
  should have a path of '/..//example.com'

Addressable::URI when parsed from '/a/b/c/./../../g'
  should not be considered to be in normal form
  should normalize to '/a/g'

Addressable::URI when parsed from 'mid/content=5/../6'
  should not be considered to be in normal form
  should normalize to 'mid/6'

Addressable::URI when parsed from 'http://www.example.com///../'
  should not be considered to be in normal form
  should normalize to 'http://www.example.com//'

Addressable::URI when parsed from 'http://example.com/path/to/resource/'
  should use the 'http' scheme
  should have an authority segment of 'example.com'
  should have a host of 'example.com'
  should have no username
  should have no password
  should use port 80
  should have a path of '/path/to/resource/'
  should have no query string
  should have no fragment
  should be considered absolute
  should not be considered relative
  should be exactly equal to http://example.com:8080/
  should have a route of 'resource/' from 'http://example.com/path/to/'
  should have a route of '../' from 'http://example.com/path/to/resource/sub'
  should have a route of 'resource/' from 'http://example.com/path/to/another'
  should have a route of 'resource/' from 'http://example.com/path/to/res'
  should have a route of 'resource/' from 'http://example.com:80/path/to/'
  should have a route of 'http://example.com/path/to/' from 'http://example.com:8080/path/to/'
  should have a route of 'http://example.com/path/to/' from 'http://user:pass@example.com/path/to/'
  should have a route of '../../path/to/resource/' from 'http://example.com/to/resource/'
  should correctly convert to a hash
  should be identical to its duplicate

Addressable::URI when parsed from 'relative/path/to/resource'
  should not have a scheme
  should not be considered ip-based
  should not have an authority segment
  should not have a host
  should have no username
  should have no password
  should not have a port
  should have a path of 'relative/path/to/resource'
  should have no query string
  should have no fragment
  should not be considered absolute
  should be considered relative
  should raise an error if routing is attempted
  when joined with 'another/relative/path' should be 'relative/path/to/another/relative/path'
  should be identical to its duplicate

Addressable::URI when parsed from 'relative_path_with_no_slashes'
  should not have a scheme
  should not be considered ip-based
  should not have an authority segment
  should not have a host
  should have no username
  should have no password
  should not have a port
  should have a path of 'relative_path_with_no_slashes'
  should have no query string
  should have no fragment
  should not be considered absolute
  should be considered relative
  when joined with 'another_relative_path' should be 'another_relative_path'

Addressable::URI when parsed from 'http://example.com/file.txt'
  should have a scheme of 'http'
  should have an authority segment of 'example.com'
  should have a host of 'example.com'
  should have no username
  should have no password
  should use port 80
  should have a path of '/file.txt'
  should have a basename of 'file.txt'
  should have an extname of '.txt'
  should have no query string
  should have no fragment

Addressable::URI when parsed from 'http://example.com/file.txt;parameter'
  should have a scheme of 'http'
  should have an authority segment of 'example.com'
  should have a host of 'example.com'
  should have no username
  should have no password
  should use port 80
  should have a path of '/file.txt;parameter'
  should have a basename of 'file.txt'
  should have an extname of '.txt'
  should have no query string
  should have no fragment

Addressable::URI when parsed from 'http://example.com/file.txt;x=y'
  should have a scheme of 'http'
  should have a scheme of 'http'
  should have an authority segment of 'example.com'
  should have a host of 'example.com'
  should have no username
  should have no password
  should use port 80
  should have a path of '/file.txt;x=y'
  should have an extname of '.txt'
  should have no query string
  should have no fragment
  should be considered to be in normal form

Addressable::URI when parsed from 'svn+ssh://developername@rubyforge.org/var/svn/project'
  should have a scheme of 'svn+ssh'
  should be considered to be ip-based
  should have a path of '/var/svn/project'
  should have a username of 'developername'
  should have no password
  should be considered to be in normal form

Addressable::URI when parsed from 'ssh+svn://developername@RUBYFORGE.ORG/var/svn/project'
  should have a scheme of 'ssh+svn'
  should have a normalized scheme of 'svn+ssh'
  should have a normalized site of 'svn+ssh'
  should not be considered to be ip-based
  should have a path of '/var/svn/project'
  should have a username of 'developername'
  should have no password
  should not be considered to be in normal form

Addressable::URI when parsed from 'mailto:user@example.com'
  should have a scheme of 'mailto'
  should not be considered to be ip-based
  should have a path of 'user@example.com'
  should have no user
  should be considered to be in normal form

Addressable::URI when parsed from 'tag:example.com,2006-08-18:/path/to/something'
  should have a scheme of 'tag'
  should be considered to be ip-based
  should have a path of 'example.com,2006-08-18:/path/to/something'
  should have no user
  should be considered to be in normal form
  should have a 'null' origin

Addressable::URI when parsed from 'http://example.com/x;y/'
  should be considered to be in normal form

Addressable::URI when parsed from 'http://example.com/?x=1&y=2'
  should be considered to be in normal form

Addressable::URI when parsed from 'view-source:http://example.com/'
  should have a scheme of 'view-source'
  should have a path of 'http://example.com/'
  should be considered to be in normal form
  should have a 'null' origin

Addressable::URI when parsed from 'http://user:pass@example.com/path/to/resource?query=x#fragment'
  should use the 'http' scheme
  should have an authority segment of 'user:pass@example.com'
  should have a username of 'user'
  should have a password of 'pass'
  should have a host of 'example.com'
  should use port 80
  should have a path of '/path/to/resource'
  should have a query string of 'query=x'
  should have a fragment of 'fragment'
  should be considered to be in normal form
  should have a route of '../../' to 'http://user:pass@example.com/path/'
  should have a route of 'to/resource?query=x#fragment' from 'http://user:pass@example.com/path/'
  should have a route of '?query=x#fragment' from 'http://user:pass@example.com/path/to/resource'
  should have a route of '#fragment' from 'http://user:pass@example.com/path/to/resource?query=x'
  should have a route of '#fragment' from 'http://user:pass@example.com/path/to/resource?query=x#fragment'
  should have a route of 'http://elsewhere.com/' to 'http://elsewhere.com/'
  should have a route of 'http://user:pass@example.com/path/to/resource?query=x#fragment' from 'http://example.com/path/to/'
  should have the correct scheme after assignment
  should have the correct site segment after assignment
  should have the correct authority segment after assignment
  should have the correct userinfo segment after assignment
  should have the correct username after assignment
  should have the correct password after assignment
  should have the correct host after assignment
  should have the correct host after assignment
  should raise an error if assigning a bogus object to the hostname
  should have the correct port after assignment
  should have the correct origin after assignment
  should have the correct path after assignment
  should have the correct scheme and authority after nil assignment
  should have the correct scheme and authority after assignment
  should have the correct path after nil assignment
  should have the correct query string after assignment
  should have the correct query string after hash assignment
  should have the correct query string after flag hash assignment
  should raise an error if query values are set to a bogus type
  should have the correct fragment after assignment
  should have the correct values after a merge
  should have the correct values after a merge
  should have the correct values after a merge
  should have the correct values after a merge
  should have the correct values after a merge
  should have the correct values after a merge
  should have the correct values after a merge
  should have the correct values after a destructive merge
  should fail to merge with bogus values
  should fail to merge with bogus values
  should fail to merge with bogus parameters
  should fail to merge with bogus parameters
  should fail to merge with both authority and subcomponents
  should fail to merge with both userinfo and subcomponents
  should be identical to its duplicate
  should have an origin of 'http://example.com'

Addressable::URI when parsed from 'http://example.com/search?q=Q%26A'
  should have a query of 'q=Q%26A'
  should have query_values of {'q' => 'Q&A'}
  should normalize to the original uri (with the ampersand properly percent-encoded)

Addressable::URI when parsed from 'http://example.com/?&x=b'
  should have a query of '&x=b'
  should have query_values of {'x' => 'b'}

Addressable::URI when parsed from 'http://example.com/?q='one;two'&x=1'
  should have a query of 'q='one;two'&x=1'
  should have query_values of {"q" => "'one;two'", "x" => "1"}
  should escape the ';' character when normalizing to avoid ambiguity with the W3C HTML 4.01 specification

Addressable::URI when parsed from 'http://example.com/?&&x=b'
  should have a query of '&&x=b'
  should have query_values of {'x' => 'b'}

Addressable::URI when parsed from 'http://example.com/?q=a&&x=b'
  should have a query of 'q=a&&x=b'
  should have query_values of {'q' => 'a, 'x' => 'b'}

Addressable::URI when parsed from 'http://example.com/?q&&x=b'
  should have a query of 'q&&x=b'
  should have query_values of {'q' => true, 'x' => 'b'}

Addressable::URI when parsed from 'http://example.com/?q=a+b'
  should have a query of 'q=a+b'
  should have query_values of {'q' => 'a b'}
  should have a normalized query of 'q=a+b'

Addressable::URI when parsed from 'http://example.com/?q=a%2bb'
  should have a query of 'q=a+b'
  should have query_values of {'q' => 'a+b'}
  should have a normalized query of 'q=a%2Bb'

Addressable::URI when parsed from 'http://example.com/?v=%7E&w=%&x=%25&y=%2B&z=C%CC%A7'
  should have a normalized query of 'v=~&w=%25&x=%25&y=%2B&z=%C3%87'

Addressable::URI when parsed from 'http://example.com/?v=%7E&w=%&x=%25&y=+&z=C%CC%A7'
  should have a normalized query of 'v=~&w=%25&x=%25&y=+&z=%C3%87'

Addressable::URI when parsed from 'http://example/?b=1&a=2&c=3'
  should have a sorted normalized query of 'a=2&b=1&c=3'

Addressable::URI when parsed from 'http://example/?&a&&c&'
  should have a compacted normalized query of 'a&c'

Addressable::URI when parsed from 'http://example.com/sound%2bvision'
  should have a normalized path of '/sound+vision'

Addressable::URI when parsed from 'http://example.com/?q='
  should have a query of 'q='
  should have query_values of {'q' => ''}

Addressable::URI when parsed from 'http://user@example.com'
  should use the 'http' scheme
  should have a username of 'user'
  should have no password
  should have a userinfo of 'user'
  should have a normalized userinfo of 'user'
  should have a host of 'example.com'
  should have default_port 80
  should use port 80
  should have the correct username after assignment
  should have the correct password after assignment
  should have the correct userinfo segment after assignment
  should have the correct userinfo segment after nil assignment
  should have the correct authority segment after assignment
  should raise an error after nil assignment of authority segment

Addressable::URI when parsed from 'http://user:@example.com'
  should use the 'http' scheme
  should have a username of 'user'
  should have a password of ''
  should have a normalized userinfo of 'user:'
  should have a host of 'example.com'
  should use port 80
  should have the correct username after assignment
  should have the correct password after assignment
  should have the correct authority segment after assignment

Addressable::URI when parsed from 'http://:pass@example.com'
  should use the 'http' scheme
  should have a username of ''
  should have a password of 'pass'
  should have a userinfo of ':pass'
  should have a normalized userinfo of ':pass'
  should have a host of 'example.com'
  should use port 80
  should have the correct username after assignment
  should have the correct password after assignment
  should have the correct authority segment after assignment

Addressable::URI when parsed from 'http://:@example.com'
  should use the 'http' scheme
  should have a username of ''
  should have a password of ''
  should have a normalized userinfo of nil
  should have a host of 'example.com'
  should use port 80
  should have the correct username after assignment
  should have the correct password after assignment
  should have the correct authority segment after assignment

Addressable::URI when parsed from '#example'
  should be considered relative
  should have a host of nil
  should have a site of nil
  should have a normalized_site of nil
  should have a path of ''
  should have a query string of nil
  should have a fragment of 'example'

Addressable::URI when parsed from the network-path reference '//example.com/'
  should be considered relative
  should have a host of 'example.com'
  should have a path of '/'
  should raise an error if routing is attempted
  should have a 'null' origin

Addressable::URI when parsed from 'feed://http://example.com/'
  should have a host of 'http'
  should have a path of '//example.com/'

Addressable::URI when parsed from 'feed:http://example.com/'
  should have a path of 'http://example.com/'
  should normalize to 'http://example.com/'
  should have a 'null' origin

Addressable::URI when parsed from 'example://a/b/c/%7Bfoo%7D'
  should be equivalent to eXAMPLE://a/./b/../b/%63/%7bfoo%7d
  should have an origin of 'example://a'

Addressable::URI when parsed from 'http://example.com/indirect/path/./to/../resource/'
  should use the 'http' scheme
  should have a host of 'example.com'
  should use port 80
  should have a path of '/indirect/path/./to/../resource/'
  should have a normalized path of '/indirect/path/resource/'

Addressable::URI when parsed from 'http://under_score.example.com/'
  should not cause an error

Addressable::URI when parsed from './this:that'
  should be considered relative
  should have no scheme
  should have a 'null' origin

Addressable::URI when parsed from 'this:that'
  should be considered absolute
  should have a scheme of 'this'
  should have a 'null' origin

Addressable::URI when parsed from '?'
  should normalize to ''
  should have the correct return type
  should have a 'null' origin

Addressable::URI when parsed from '?one=1&two=2&three=3'
  should have the correct query values
  should raise an error for invalid return type values
  should have the correct array query values
  should have a 'null' origin

Addressable::URI when parsed from '?one=1=uno&two=2=dos'
  should have the correct query values
  should have the correct array query values

Addressable::URI when parsed from '?one[two][three]=four'
  should have the correct query values
  should have the correct array query values

Addressable::URI when parsed from '?one.two.three=four'
  should have the correct query values
  should have the correct array query values

Addressable::URI when parsed from '?one[two][three]=four&one[two][five]=six'
  should have the correct query values
  should have the correct array query values

Addressable::URI when parsed from '?one.two.three=four&one.two.five=six'
  should have the correct query values
  should have the correct array query values

Addressable::URI when parsed from '?one=two&one=three'
  should have correct array query values
  should have correct hash query values (PENDING: This is probably more desirable behavior.)
  should handle assignment with keys of mixed type

Addressable::URI when parsed from '?one[two][three][]=four&one[two][three][]=five'
  should have correct query values
  should have correct array query values

Addressable::URI when parsed from '?one[two][three][0]=four&one[two][three][1]=five'
  should have the correct query values

Addressable::URI when parsed from '?one[two][three][1]=four&one[two][three][0]=five'
  should have the correct query values

Addressable::URI when parsed from '?one[two][three][2]=four&one[two][three][1]=five'
  should have the correct query values

Addressable::URI when parsed from 'http://www.詹姆斯.com/'
  should be equivalent to 'http://www.xn--8ws00zhy3a.com/'
  should not have domain name encoded during normalization
  should have an origin of 'http://www.xn--8ws00zhy3a.com'

Addressable::URI when parsed from 'http://www.詹姆斯.com/ some spaces /'
  should be equivalent to 'http://www.xn--8ws00zhy3a.com/%20some%20spaces%20/'
  should not have domain name encoded during normalization
  should have an origin of 'http://www.xn--8ws00zhy3a.com'

Addressable::URI when parsed from 'http://www.xn--8ws00zhy3a.com/'
  should be displayed as http://www.詹姆斯.com/
  should properly force the encoding
  should have an origin of 'http://www.xn--8ws00zhy3a.com'

Addressable::URI when parsed from 'http://www.詹姆斯.com/atomtests/iri/詹.html'
  should normalize to http://www.xn--8ws00zhy3a.com/atomtests/iri/%E8%A9%B9.html

Addressable::URI when parsed from a percent-encoded IRI
  should normalize to something sane
  should have the correct origin

Addressable::URI with a base uri of 'http://a/b/c/d;p?q'
  when joined with 'g:h' should resolve to g:h
  when joined with 'g' should resolve to http://a/b/c/g
  when joined with './g' should resolve to http://a/b/c/g
  when joined with 'g/' should resolve to http://a/b/c/g/
  when joined with '/g' should resolve to http://a/g
  when joined with '//g' should resolve to http://g
  when joined with '?y' should resolve to http://a/b/c/d;p?y
  when joined with 'g?y' should resolve to http://a/b/c/g?y
  when joined with '#s' should resolve to http://a/b/c/d;p?q#s
  when joined with 'g#s' should resolve to http://a/b/c/g#s
  when joined with 'g?y#s' should resolve to http://a/b/c/g?y#s
  when joined with ';x' should resolve to http://a/b/c/;x
  when joined with 'g;x' should resolve to http://a/b/c/g;x
  when joined with 'g;x?y#s' should resolve to http://a/b/c/g;x?y#s
  when joined with '' should resolve to http://a/b/c/d;p?q
  when joined with '.' should resolve to http://a/b/c/
  when joined with './' should resolve to http://a/b/c/
  when joined with '..' should resolve to http://a/b/
  when joined with '../' should resolve to http://a/b/
  when joined with '../g' should resolve to http://a/b/g
  when joined with '../..' should resolve to http://a/
  when joined with '../../' should resolve to http://a/
  when joined with '../../g' should resolve to http://a/g
  when joined with '../../../g' should resolve to http://a/g
  when joined with '../.././../g' should resolve to http://a/g
  when joined with '../../../../g' should resolve to http://a/g
  when joined with '/./g' should resolve to http://a/g
  when joined with '/../g' should resolve to http://a/g
  when joined with 'g.' should resolve to http://a/b/c/g.
  when joined with '.g' should resolve to http://a/b/c/.g
  when joined with 'g..' should resolve to http://a/b/c/g..
  when joined with '..g' should resolve to http://a/b/c/..g
  when joined with './../g' should resolve to http://a/b/g
  when joined with './g/.' should resolve to http://a/b/c/g/
  when joined with 'g/./h' should resolve to http://a/b/c/g/h
  when joined with 'g/../h' should resolve to http://a/b/c/h
  when joined with 'g;x=1/./y' should resolve to http://a/b/c/g;x=1/y
  when joined with 'g;x=1/../y' should resolve to http://a/b/c/y
  when joined with 'g?y/./x' should resolve to http://a/b/c/g?y/./x
  when joined with 'g?y/../x' should resolve to http://a/b/c/g?y/../x
  when joined with 'g#s/./x' should resolve to http://a/b/c/g#s/./x
  when joined with 'g#s/../x' should resolve to http://a/b/c/g#s/../x
  when joined with 'http:g' should resolve to http:g
  when joined with '//example.com/' should resolve to http://example.com/
  when joined with a bogus object a TypeError should be raised

Addressable::URI when converting the path 'relative/path/to/something'
  should convert to 'relative/path/to/something'
  should join with an absolute file path correctly

Addressable::URI when converting a bogus path
  should raise a TypeError

Addressable::URI when given a UNIX root directory
  should convert to 'file:///'
  should have an origin of 'file://'

Addressable::URI when given a Windows root directory
  should convert to 'file:///c:/'
  should have an origin of 'file://'

Addressable::URI when given the path '/one/two/'
  should convert to 'file:///one/two/'
  should have an origin of 'file://'

Addressable::URI when given the tld
  'uk' should have a tld of 'uk'
  which
    contains a subdomain
    is part of the domain

Addressable::URI when given the path 'c:\windows\My Documents 100%20\foo.txt'
  should convert to 'file:///c:/windows/My%20Documents%20100%20/foo.txt'
  should have an origin of 'file://'

Addressable::URI when given the path 'file://c:\windows\My Documents 100%20\foo.txt'
  should convert to 'file:///c:/windows/My%20Documents%20100%20/foo.txt'
  should have an origin of 'file://'

Addressable::URI when given the path 'file:c:\windows\My Documents 100%20\foo.txt'
  should convert to 'file:///c:/windows/My%20Documents%20100%20/foo.txt'
  should have an origin of 'file://'

Addressable::URI when given the path 'file:/c:\windows\My Documents 100%20\foo.txt'
  should convert to 'file:///c:/windows/My%20Documents%20100%20/foo.txt'
  should have an origin of 'file://'

Addressable::URI when given the path 'file:///c|/windows/My%20Documents%20100%20/foo.txt'
  should convert to 'file:///c:/windows/My%20Documents%20100%20/foo.txt'
  should have an origin of 'file://'

Addressable::URI when given an http protocol URI
  should not do any conversion at all

Addressable::URI when parsing a non-String object
  should correctly parse anything with a 'to_str' method
  should raise a TypeError for objects than cannot be converted
  should correctly parse heuristically anything with a 'to_str' method
  should raise a TypeError for objects than cannot be converted

Addressable::URI when form encoding a hash
  should result in correct percent encoded sequence
  should result in correct percent encoded sequence
  should result in correct percent encoded sequence
  should result in correct percent encoded sequence
  should result in correctly encoded newlines
  should result in a sorted percent encoded sequence

Addressable::URI when form encoding a non-Array object
  should raise a TypeError for objects than cannot be converted

Addressable::URI when form encoding the example value from OAuth 2
  should result in correct values

Addressable::URI when form unencoding the example value from OAuth 2
  should result in correct values

Addressable::URI when form unencoding a string
  should result in correct values
  should result in correct values
  should result in correct values
  should result in correct values
  should result in correct values
  should result in correct values

Addressable::URI when form unencoding a non-String object
  should correctly parse anything with a 'to_str' method
  should raise a TypeError for objects than cannot be converted

Addressable::URI when normalizing a non-String object
  should correctly parse anything with a 'to_str' method
  should raise a TypeError for objects than cannot be converted
  should raise a TypeError for objects than cannot be converted

Addressable::URI when normalizing a path with an encoded slash
  should result in correct percent encoded sequence

Addressable::URI when normalizing a partially encoded string
  should result in correct percent encoded sequence
  should result in correct percent encoded sequence

Addressable::URI when normalizing a unicode sequence
  should result in correct percent encoded sequence
  should result in correct percent encoded sequence

Addressable::URI when normalizing a multibyte string
  should result in correct percent encoded sequence
  should result in correct percent encoded sequence

Addressable::URI when normalizing a string but leaving some characters encoded
  should result in correct percent encoded sequence
  should not modify the character class

Addressable::URI when encoding a string with existing encodings to upcase
  should result in correct percent encoded sequence

Addressable::URI when encoding a multibyte string
  should result in correct percent encoded sequence
  should result in correct percent encoded sequence

Addressable::URI when form encoding a multibyte string
  should result in correct percent encoded sequence

Addressable::URI when encoding a string with ASCII chars 0-15
  should result in correct percent encoded sequence
  should result in correct percent encoded sequence

Addressable::URI when unencoding a multibyte string
  should result in correct percent encoded sequence
  should consistently use UTF-8 internally
  should result in correct percent encoded sequence as a URI

Addressable::URI when partially unencoding a string
  should unencode all characters by default
  should unencode characters not in leave_encoded
  should leave characters in leave_encoded alone

Addressable::URI when unencoding a bogus object
  should raise a TypeError
  should raise a TypeError

Addressable::URI when encoding a bogus object
  should raise a TypeError
  should raise a TypeError
  should raise a TypeError
  should raise a TypeError

Addressable::URI when given the input 'http://example.com/'
  should heuristically parse to 'http://example.com/'
  should not raise error when frozen

Addressable::URI when given the input 'https://example.com/'
  should heuristically parse to 'https://example.com/'

Addressable::URI when given the input 'http:example.com/'
  should heuristically parse to 'http://example.com/'
  should heuristically parse to 'http://example.com/' even with a scheme hint of 'ftp'

Addressable::URI when given the input 'https:example.com/'
  should heuristically parse to 'https://example.com/'
  should heuristically parse to 'https://example.com/' even with a scheme hint of 'ftp'

Addressable::URI when given the input 'http://example.com/example.com/'
  should heuristically parse to 'http://example.com/example.com/'

Addressable::URI when given the input 'http://prefix\.example.com/'
  should heuristically parse to 'http://prefix/.example.com/'
  should heuristically parse to 'http://prefix/.example.com/' even with a scheme hint of 'ftp'

Addressable::URI when given the input 'http://p:\/'
  should heuristically parse to 'http://p//'
  should heuristically parse to 'http://p//' even with a scheme hint of 'ftp'

Addressable::URI when given the input 'http://p://'
  should heuristically parse to 'http://p//'
  should heuristically parse to 'http://p//' even with a scheme hint of 'ftp'

Addressable::URI when given the input 'http://p://p'
  should heuristically parse to 'http://p//p'
  should heuristically parse to 'http://p//p' even with a scheme hint of 'ftp'

Addressable::URI when given the input 'http://prefix .example.com/'
  should heuristically parse to 'http://prefix%20.example.com/'
  should heuristically parse to 'http://prefix%20.example.com/' even with a scheme hint of 'ftp'

Addressable::URI when given the input '  http://www.example.com/  '
  should heuristically parse to 'http://prefix%20.example.com/'

Addressable::URI when given the input 'http://prefix%2F.example.com/'
  should heuristically parse to 'http://prefix%2F.example.com/'
  should heuristically parse to 'http://prefix%2F.example.com/' even with a scheme hint of 'ftp'

Addressable::URI when given the input '/path/to/resource'
  should heuristically parse to '/path/to/resource'

Addressable::URI when given the input 'relative/path/to/resource'
  should heuristically parse to 'relative/path/to/resource'

Addressable::URI when given the input 'example.com'
  should heuristically parse to 'http://example.com'

Addressable::URI when given the input 'example.com' and a scheme hint of 'ftp'
  should heuristically parse to 'http://example.com'

Addressable::URI when given the input 'example.com:21' and a scheme hint of 'ftp'
  should heuristically parse to 'http://example.com:21'

Addressable::URI when given the input 'example.com/path/to/resource'
  should heuristically parse to 'http://example.com/path/to/resource'

Addressable::URI when given the input 'http:///example.com'
  should heuristically parse to 'http://example.com'

Addressable::URI when given the input which start with digits and has specified port
  should heuristically parse to 'http://7777.example.org:8089'

Addressable::URI when given the input 'feed:///example.com'
  should heuristically parse to 'feed://example.com'

Addressable::URI when given the input 'file://localhost/path/to/resource/'
  should heuristically parse to 'file:///path/to/resource/'

Addressable::URI when given the input 'file://path/to/resource/'
  should heuristically parse to 'file:///path/to/resource/'

Addressable::URI when given the input 'file://///path/to/resource/'
  should heuristically parse to 'file:////path/to/resource/'

Addressable::URI when given the input 'feed://http://example.com'
  should heuristically parse to 'feed:http://example.com'

Addressable::URI when given the input ::URI.parse('http://example.com')
  should heuristically parse to 'http://example.com'

Addressable::URI when given the input: 'user@domain.com'
  for heuristic parse
    should remain 'mailto:user@domain.com'
    should have a scheme of 'mailto'
    should remain 'acct:user@domain.com'
    HTTP
      should remain 'http://user@domain.com/'
      should have the username 'user' for HTTP basic authentication

Addressable::URI when assigning query values
  should correctly assign {:a => 'a', :b => ['c', 'd', 'e']}
  should raise an error attempting to assign {'a' => {'b' => ['c']}}
  should raise an error attempting to assign {:b => '2', :a => {:c => '1'}}
  should raise an error attempting to assign {:a => 'a', :b => [{:c => 'c', :d => 'd'}, {:e => 'e', :f => 'f'}]}
  should raise an error attempting to assign {:a => 'a', :b => [{:c => true, :d => 'd'}, {:e => 'e', :f => 'f'}]}
  should raise an error attempting to assign {:a => 'a', :b => {:c => true, :d => 'd'}}
  should raise an error attempting to assign {:a => 'a', :b => {:c => true, :d => 'd'}}
  should correctly assign {:a => 1, :b => 1.5}
  should raise an error attempting to assign {:z => 1, :f => [2, {999.1 => [3,'4']}, ['h', 'i']], :a => {:b => ['c', 'd'], :e => true, :y => 0.5}}
  should correctly assign {}
  should correctly assign nil
  should correctly sort {'ab' => 'c', :ab => 'a', :a => 'x'}
  should correctly assign [['b', 'c'], ['b', 'a'], ['a', 'a']]
  should preserve query string order
  when a hash with mixed types is assigned to query_values
    should not raise an error (PENDING: Issue #94)

Addressable::URI when assigning path values
  should correctly assign paths containing colons
  should correctly assign paths containing colons
  should correctly assign paths containing colons
  should not allow relative paths to be assigned on absolute URIs
  should not allow relative paths to be assigned on absolute URIs
  should not allow relative paths to be assigned on absolute URIs

Addressable::URI when initializing a subclass of Addressable::URI
  should have the same class after being parsed
  should have the same class as its duplicate
  should have the same class after being normalized
  should have the same class after being merged
  should have the same class after being joined

Pending: (Failures listed here are expected and do not affect your suite's status)

  1) Addressable::URI when assigning IPv6 address should not allow to set bare IPv6 address as host
     # not checked
     # ./spec/addressable/uri_spec.rb:2100

  2) Addressable::URI when parsed from 'http://example.com/%2E/' should be considered to be in normal form
     # path segment normalization should happen before percent escaping normalization
     # ./spec/addressable/uri_spec.rb:2965

  3) Addressable::URI when parsed from 'http://example.com/%2E/' should normalize to 'http://example.com/%2E/'
     # path segment normalization should happen before percent escaping normalization
     # ./spec/addressable/uri_spec.rb:2973

  4) Addressable::URI when parsed from '?one=two&one=three' should have correct hash query values
     # This is probably more desirable behavior.
     # ./spec/addressable/uri_spec.rb:4960

  5) Addressable::URI when assigning query values when a hash with mixed types is assigned to query_values should not raise an error
     # Issue #94
     # ./spec/addressable/uri_spec.rb:6522

Finished in 2.26 seconds (files took 1.2 seconds to load)
1386 examples, 0 failures, 5 pending

Coverage report generated for RSpec to /tmp/guix-build-ruby-addressable-2.7.0.drv-0/gem/coverage. 1545 / 1646 LOC (93.86%) covered.
phase `check' succeeded after 4.2 seconds
starting phase `install'
/gnu/store/gmk75b46yq0n38v0rj7fp4x65p17w8n3-ruby-addressable-2.7.0/lib/ruby/vendor_ruby/gems/addressable-2.7.0/CHANGELOG.md
/gnu/store/gmk75b46yq0n38v0rj7fp4x65p17w8n3-ruby-addressable-2.7.0/lib/ruby/vendor_ruby/gems/addressable-2.7.0/Gemfile
/gnu/store/gmk75b46yq0n38v0rj7fp4x65p17w8n3-ruby-addressable-2.7.0/lib/ruby/vendor_ruby/gems/addressable-2.7.0/LICENSE.txt
/gnu/store/gmk75b46yq0n38v0rj7fp4x65p17w8n3-ruby-addressable-2.7.0/lib/ruby/vendor_ruby/gems/addressable-2.7.0/README.md
/gnu/store/gmk75b46yq0n38v0rj7fp4x65p17w8n3-ruby-addressable-2.7.0/lib/ruby/vendor_ruby/gems/addressable-2.7.0/Rakefile
/gnu/store/gmk75b46yq0n38v0rj7fp4x65p17w8n3-ruby-addressable-2.7.0/lib/ruby/vendor_ruby/gems/addressable-2.7.0/data/unicode.data
/gnu/store/gmk75b46yq0n38v0rj7fp4x65p17w8n3-ruby-addressable-2.7.0/lib/ruby/vendor_ruby/gems/addressable-2.7.0/lib/addressable.rb
/gnu/store/gmk75b46yq0n38v0rj7fp4x65p17w8n3-ruby-addressable-2.7.0/lib/ruby/vendor_ruby/gems/addressable-2.7.0/lib/addressable/idna.rb
/gnu/store/gmk75b46yq0n38v0rj7fp4x65p17w8n3-ruby-addressable-2.7.0/lib/ruby/vendor_ruby/gems/addressable-2.7.0/lib/addressable/idna/native.rb
/gnu/store/gmk75b46yq0n38v0rj7fp4x65p17w8n3-ruby-addressable-2.7.0/lib/ruby/vendor_ruby/gems/addressable-2.7.0/lib/addressable/idna/pure.rb
/gnu/store/gmk75b46yq0n38v0rj7fp4x65p17w8n3-ruby-addressable-2.7.0/lib/ruby/vendor_ruby/gems/addressable-2.7.0/lib/addressable/template.rb
/gnu/store/gmk75b46yq0n38v0rj7fp4x65p17w8n3-ruby-addressable-2.7.0/lib/ruby/vendor_ruby/gems/addressable-2.7.0/lib/addressable/uri.rb
/gnu/store/gmk75b46yq0n38v0rj7fp4x65p17w8n3-ruby-addressable-2.7.0/lib/ruby/vendor_ruby/gems/addressable-2.7.0/lib/addressable/version.rb
/gnu/store/gmk75b46yq0n38v0rj7fp4x65p17w8n3-ruby-addressable-2.7.0/lib/ruby/vendor_ruby/gems/addressable-2.7.0/spec/addressable/idna_spec.rb
/gnu/store/gmk75b46yq0n38v0rj7fp4x65p17w8n3-ruby-addressable-2.7.0/lib/ruby/vendor_ruby/gems/addressable-2.7.0/spec/addressable/net_http_compat_spec.rb
/gnu/store/gmk75b46yq0n38v0rj7fp4x65p17w8n3-ruby-addressable-2.7.0/lib/ruby/vendor_ruby/gems/addressable-2.7.0/spec/addressable/rack_mount_compat_spec.rb
/gnu/store/gmk75b46yq0n38v0rj7fp4x65p17w8n3-ruby-addressable-2.7.0/lib/ruby/vendor_ruby/gems/addressable-2.7.0/spec/addressable/security_spec.rb
/gnu/store/gmk75b46yq0n38v0rj7fp4x65p17w8n3-ruby-addressable-2.7.0/lib/ruby/vendor_ruby/gems/addressable-2.7.0/spec/addressable/template_spec.rb
/gnu/store/gmk75b46yq0n38v0rj7fp4x65p17w8n3-ruby-addressable-2.7.0/lib/ruby/vendor_ruby/gems/addressable-2.7.0/spec/addressable/uri_spec.rb
/gnu/store/gmk75b46yq0n38v0rj7fp4x65p17w8n3-ruby-addressable-2.7.0/lib/ruby/vendor_ruby/gems/addressable-2.7.0/spec/spec_helper.rb
/gnu/store/gmk75b46yq0n38v0rj7fp4x65p17w8n3-ruby-addressable-2.7.0/lib/ruby/vendor_ruby/gems/addressable-2.7.0/tasks/clobber.rake
/gnu/store/gmk75b46yq0n38v0rj7fp4x65p17w8n3-ruby-addressable-2.7.0/lib/ruby/vendor_ruby/gems/addressable-2.7.0/tasks/gem.rake
/gnu/store/gmk75b46yq0n38v0rj7fp4x65p17w8n3-ruby-addressable-2.7.0/lib/ruby/vendor_ruby/gems/addressable-2.7.0/tasks/git.rake
/gnu/store/gmk75b46yq0n38v0rj7fp4x65p17w8n3-ruby-addressable-2.7.0/lib/ruby/vendor_ruby/gems/addressable-2.7.0/tasks/metrics.rake
/gnu/store/gmk75b46yq0n38v0rj7fp4x65p17w8n3-ruby-addressable-2.7.0/lib/ruby/vendor_ruby/gems/addressable-2.7.0/tasks/rspec.rake
/gnu/store/gmk75b46yq0n38v0rj7fp4x65p17w8n3-ruby-addressable-2.7.0/lib/ruby/vendor_ruby/gems/addressable-2.7.0/tasks/yard.rake
Successfully installed addressable-2.7.0
Parsing documentation for addressable-2.7.0
Parsing sources...
 12% [ 1/ 8]  README.md
 25% [ 2/ 8]  lib/addressable.rb
 37% [ 3/ 8]  lib/addressable/idna.rb
 50% [ 4/ 8]  lib/addressable/idna/native.rb
 62% [ 5/ 8]  lib/addressable/idna/pure.rb
 75% [ 6/ 8]  lib/addressable/template.rb
 87% [ 7/ 8]  lib/addressable/uri.rb
100% [ 8/ 8]  lib/addressable/version.rb

Installing ri documentation for addressable-2.7.0
Done installing documentation for addressable after 1 seconds
1 gem installed
deleting '/gnu/store/gmk75b46yq0n38v0rj7fp4x65p17w8n3-ruby-addressable-2.7.0/lib/ruby/vendor_ruby/cache/./addressable-2.7.0.gem' for reproducibility
phase `install' succeeded after 2.3 seconds
starting phase `wrap'
phase `wrap' succeeded after 0.0 seconds
starting phase `patch-shebangs'
phase `patch-shebangs' succeeded after 0.0 seconds
starting phase `strip'
stripping binaries in "/gnu/store/gmk75b46yq0n38v0rj7fp4x65p17w8n3-ruby-addressable-2.7.0/lib" with "strip" and flags ("--strip-unneeded" "--enable-deterministic-archives")
phase `strip' succeeded after 0.1 seconds
starting phase `validate-runpath'
validating RUNPATH of 0 binaries in "/gnu/store/gmk75b46yq0n38v0rj7fp4x65p17w8n3-ruby-addressable-2.7.0/lib"...
phase `validate-runpath' succeeded after 0.0 seconds
starting phase `validate-documentation-location'
phase `validate-documentation-location' succeeded after 0.0 seconds
starting phase `delete-info-dir-file'
phase `delete-info-dir-file' succeeded after 0.0 seconds
starting phase `patch-dot-desktop-files'
phase `patch-dot-desktop-files' succeeded after 0.0 seconds
starting phase `make-dynamic-linker-cache'
phase `make-dynamic-linker-cache' succeeded after 0.0 seconds
starting phase `install-license-files'
installing 1 license files from '.'
phase `install-license-files' succeeded after 0.0 seconds
starting phase `reset-gzip-timestamps'
phase `reset-gzip-timestamps' succeeded after 0.0 seconds
starting phase `compress-documentation'
phase `compress-documentation' succeeded after 0.0 seconds