Mock Version: 4.1
Mock Version: 4.1
Mock Version: 4.1
ENTER ['do_with_status'](['bash', '--login', '-c', '/usr/bin/rpmbuild -bs --noclean --target noarch --nodeps /builddir/build/SPECS/python-uri-template.spec'], chrootPath='/var/lib/mock/dist-oc9-epol-build-78260-52986/root'env={'TERM': 'vt100', 'SHELL': '/bin/bash', 'HOME': '/builddir', 'HOSTNAME': 'mock', 'PATH': '/usr/bin:/bin:/usr/sbin:/sbin', 'PROMPT_COMMAND': 'printf "\\033]0;<mock-chroot>\\007"', 'PS1': '<mock-chroot> \\s-\\v\\$ ', 'LANG': 'C.UTF-8'}shell=Falselogger=<mockbuild.trace_decorator.getLog object at 0xfffdb61480f0>timeout=86400uid=991gid=135user='mockbuild'nspawn_args=[]unshare_net=TrueprintOutput=False)
Executing command: ['bash', '--login', '-c', '/usr/bin/rpmbuild -bs --noclean --target noarch --nodeps /builddir/build/SPECS/python-uri-template.spec'] with env {'TERM': 'vt100', 'SHELL': '/bin/bash', 'HOME': '/builddir', 'HOSTNAME': 'mock', 'PATH': '/usr/bin:/bin:/usr/sbin:/sbin', 'PROMPT_COMMAND': 'printf "\\033]0;<mock-chroot>\\007"', 'PS1': '<mock-chroot> \\s-\\v\\$ ', 'LANG': 'C.UTF-8'} and shell False
Building target platforms: noarch
Building for target noarch
Wrote: /builddir/build/SRPMS/python-uri-template-1.2.0-1.oc9.src.rpm
Child return code was: 0
ENTER ['do_with_status'](['bash', '--login', '-c', '/usr/bin/rpmbuild -bb --noclean --target noarch --nodeps /builddir/build/SPECS/python-uri-template.spec'], chrootPath='/var/lib/mock/dist-oc9-epol-build-78260-52986/root'env={'TERM': 'vt100', 'SHELL': '/bin/bash', 'HOME': '/builddir', 'HOSTNAME': 'mock', 'PATH': '/usr/bin:/bin:/usr/sbin:/sbin', 'PROMPT_COMMAND': 'printf "\\033]0;<mock-chroot>\\007"', 'PS1': '<mock-chroot> \\s-\\v\\$ ', 'LANG': 'C.UTF-8'}shell=Falselogger=<mockbuild.trace_decorator.getLog object at 0xfffdb61480f0>timeout=86400uid=991gid=135user='mockbuild'nspawn_args=[]unshare_net=TrueprintOutput=False)
Executing command: ['bash', '--login', '-c', '/usr/bin/rpmbuild -bb --noclean --target noarch --nodeps /builddir/build/SPECS/python-uri-template.spec'] with env {'TERM': 'vt100', 'SHELL': '/bin/bash', 'HOME': '/builddir', 'HOSTNAME': 'mock', 'PATH': '/usr/bin:/bin:/usr/sbin:/sbin', 'PROMPT_COMMAND': 'printf "\\033]0;<mock-chroot>\\007"', 'PS1': '<mock-chroot> \\s-\\v\\$ ', 'LANG': 'C.UTF-8'} and shell False
Building target platforms: noarch
Building for target noarch
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.D520OW
+ umask 022
+ cd /builddir/build/BUILD
+ cd /builddir/build/BUILD
+ rm -rf uri_template-1.2.0
+ /usr/lib/rpm/rpmuncompress -x /builddir/build/SOURCES/python-uri-template-1.2.0.tar.gz
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd uri_template-1.2.0
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ sed -i s/0.0.0/1.2.0/g setup.py
+ RPM_EC=0
++ jobs -p
+ exit 0
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.DRB6p9
+ umask 022
+ cd /builddir/build/BUILD
+ CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/OpenCloudOS/OpenCloudOS-hardened-cc1 -fstack-protector-strong  -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection'
+ export CFLAGS
+ CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/OpenCloudOS/OpenCloudOS-hardened-cc1 -fstack-protector-strong  -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection'
+ export CXXFLAGS
+ FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/OpenCloudOS/OpenCloudOS-hardened-cc1 -fstack-protector-strong  -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -I/usr/lib/gfortran/modules'
+ export FFLAGS
+ FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/OpenCloudOS/OpenCloudOS-hardened-cc1 -fstack-protector-strong  -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -I/usr/lib/gfortran/modules'
+ export FCFLAGS
+ LDFLAGS='-Wl,-z,relro -Wl,--as-needed  -Wl,-z,now -specs=/usr/lib/rpm/OpenCloudOS/OpenCloudOS-hardened-ld  -Wl,--build-id=sha1'
+ export LDFLAGS
+ LT_SYS_LIBRARY_PATH=/usr/lib:
+ export LT_SYS_LIBRARY_PATH
+ CC=gcc
+ export CC
+ CXX=g++
+ export CXX
+ cd uri_template-1.2.0
+ CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/OpenCloudOS/OpenCloudOS-hardened-cc1 -fstack-protector-strong  -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection'
+ LDFLAGS='-Wl,-z,relro -Wl,--as-needed  -Wl,-z,now -specs=/usr/lib/rpm/OpenCloudOS/OpenCloudOS-hardened-ld  -Wl,--build-id=sha1'
+ /usr/bin/python3 setup.py build '--executable=/usr/bin/python3 -s'
running build
running build_py
creating build
creating build/lib
creating build/lib/uri_template
copying uri_template/charset.py -> build/lib/uri_template
copying uri_template/expansions.py -> build/lib/uri_template
copying uri_template/uritemplate.py -> build/lib/uri_template
copying uri_template/__init__.py -> build/lib/uri_template
copying uri_template/variable.py -> build/lib/uri_template
copying uri_template/py.typed -> build/lib/uri_template
+ RPM_EC=0
++ jobs -p
+ exit 0
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.T29Vpc
+ umask 022
+ cd /builddir/build/BUILD
+ '[' /builddir/build/BUILDROOT/python-uri-template-1.2.0-1.oc9.noarch '!=' / ']'
+ rm -rf /builddir/build/BUILDROOT/python-uri-template-1.2.0-1.oc9.noarch
++ dirname /builddir/build/BUILDROOT/python-uri-template-1.2.0-1.oc9.noarch
+ mkdir -p /builddir/build/BUILDROOT
+ mkdir /builddir/build/BUILDROOT/python-uri-template-1.2.0-1.oc9.noarch
+ cd uri_template-1.2.0
+ CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/OpenCloudOS/OpenCloudOS-hardened-cc1 -fstack-protector-strong  -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection'
+ LDFLAGS='-Wl,-z,relro -Wl,--as-needed  -Wl,-z,now -specs=/usr/lib/rpm/OpenCloudOS/OpenCloudOS-hardened-ld  -Wl,--build-id=sha1'
+ /usr/bin/python3 setup.py install -O1 --skip-build --root /builddir/build/BUILDROOT/python-uri-template-1.2.0-1.oc9.noarch
running install
/usr/lib/python3.11/site-packages/setuptools/_distutils/cmd.py:66: SetuptoolsDeprecationWarning: setup.py install is deprecated.
!!
        ********************************************************************************
        Please avoid running ``setup.py`` directly.
        Instead, use pypa/build, pypa/installer or other
        standards-based tools.
        Follow the current Python packaging guidelines when building
        Python RPM packages.
        See https://blog.ganssle.io/articles/2021/10/setup-py-deprecated.html
        and https://docs.fedoraproject.org/en-US/packaging-guidelines/Python/ for details.
        ********************************************************************************
!!
  self.initialize_options()
running install_lib
creating /builddir/build/BUILDROOT/python-uri-template-1.2.0-1.oc9.noarch/usr
creating /builddir/build/BUILDROOT/python-uri-template-1.2.0-1.oc9.noarch/usr/lib
creating /builddir/build/BUILDROOT/python-uri-template-1.2.0-1.oc9.noarch/usr/lib/python3.11
creating /builddir/build/BUILDROOT/python-uri-template-1.2.0-1.oc9.noarch/usr/lib/python3.11/site-packages
creating /builddir/build/BUILDROOT/python-uri-template-1.2.0-1.oc9.noarch/usr/lib/python3.11/site-packages/uri_template
copying build/lib/uri_template/charset.py -> /builddir/build/BUILDROOT/python-uri-template-1.2.0-1.oc9.noarch/usr/lib/python3.11/site-packages/uri_template
copying build/lib/uri_template/expansions.py -> /builddir/build/BUILDROOT/python-uri-template-1.2.0-1.oc9.noarch/usr/lib/python3.11/site-packages/uri_template
copying build/lib/uri_template/uritemplate.py -> /builddir/build/BUILDROOT/python-uri-template-1.2.0-1.oc9.noarch/usr/lib/python3.11/site-packages/uri_template
copying build/lib/uri_template/__init__.py -> /builddir/build/BUILDROOT/python-uri-template-1.2.0-1.oc9.noarch/usr/lib/python3.11/site-packages/uri_template
copying build/lib/uri_template/variable.py -> /builddir/build/BUILDROOT/python-uri-template-1.2.0-1.oc9.noarch/usr/lib/python3.11/site-packages/uri_template
copying build/lib/uri_template/py.typed -> /builddir/build/BUILDROOT/python-uri-template-1.2.0-1.oc9.noarch/usr/lib/python3.11/site-packages/uri_template
byte-compiling /builddir/build/BUILDROOT/python-uri-template-1.2.0-1.oc9.noarch/usr/lib/python3.11/site-packages/uri_template/charset.py to charset.cpython-311.pyc
byte-compiling /builddir/build/BUILDROOT/python-uri-template-1.2.0-1.oc9.noarch/usr/lib/python3.11/site-packages/uri_template/expansions.py to expansions.cpython-311.pyc
byte-compiling /builddir/build/BUILDROOT/python-uri-template-1.2.0-1.oc9.noarch/usr/lib/python3.11/site-packages/uri_template/uritemplate.py to uritemplate.cpython-311.pyc
byte-compiling /builddir/build/BUILDROOT/python-uri-template-1.2.0-1.oc9.noarch/usr/lib/python3.11/site-packages/uri_template/__init__.py to __init__.cpython-311.pyc
byte-compiling /builddir/build/BUILDROOT/python-uri-template-1.2.0-1.oc9.noarch/usr/lib/python3.11/site-packages/uri_template/variable.py to variable.cpython-311.pyc
writing byte-compilation script '/tmp/tmpswxcbgxy.py'
/usr/bin/python3 /tmp/tmpswxcbgxy.py
removing /tmp/tmpswxcbgxy.py
running install_egg_info
running egg_info
creating uri_template.egg-info
writing uri_template.egg-info/PKG-INFO
writing dependency_links to uri_template.egg-info/dependency_links.txt
writing requirements to uri_template.egg-info/requires.txt
writing top-level names to uri_template.egg-info/top_level.txt
writing manifest file 'uri_template.egg-info/SOURCES.txt'
reading manifest file 'uri_template.egg-info/SOURCES.txt'
adding license file 'LICENSE'
writing manifest file 'uri_template.egg-info/SOURCES.txt'
Copying uri_template.egg-info to /builddir/build/BUILDROOT/python-uri-template-1.2.0-1.oc9.noarch/usr/lib/python3.11/site-packages/uri_template-1.2.0-py3.11.egg-info
running install_scripts
+ rm -rfv /builddir/build/BUILDROOT/python-uri-template-1.2.0-1.oc9.noarch/usr/bin/__pycache__
+ /usr/bin/find-debuginfo -j8 --strict-build-id -m -i --build-id-seed 1.2.0-1.oc9 --unique-debug-suffix -1.2.0-1.oc9.noarch --unique-debug-src-base python-uri-template-1.2.0-1.oc9.noarch -S debugsourcefiles.list /builddir/build/BUILD/uri_template-1.2.0
find: 'debug': No such file or directory
+ /usr/lib/rpm/check-buildroot
+ /usr/lib/rpm/OpenCloudOS/brp-ldconfig
+ /usr/lib/rpm/brp-compress
+ /usr/lib/rpm/OpenCloudOS/brp-strip-lto /usr/bin/strip
+ /usr/lib/rpm/brp-strip-static-archive /usr/bin/strip
+ /usr/lib/rpm/check-rpaths
+ /usr/lib/rpm/OpenCloudOS/brp-mangle-shebangs
+ /usr/lib/rpm/OpenCloudOS/brp-python-bytecompile '' 1 0
Bytecompiling .py files below /builddir/build/BUILDROOT/python-uri-template-1.2.0-1.oc9.noarch/usr/lib/python3.11 using python3.11
+ /usr/lib/rpm/OpenCloudOS/brp-python-hardlink
Executing(%check): /bin/sh -e /var/tmp/rpm-tmp.XwXIXa
+ umask 022
+ cd /builddir/build/BUILD
+ CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/OpenCloudOS/OpenCloudOS-hardened-cc1 -fstack-protector-strong  -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection'
+ export CFLAGS
+ CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/OpenCloudOS/OpenCloudOS-hardened-cc1 -fstack-protector-strong  -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection'
+ export CXXFLAGS
+ FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/OpenCloudOS/OpenCloudOS-hardened-cc1 -fstack-protector-strong  -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -I/usr/lib/gfortran/modules'
+ export FFLAGS
+ FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/OpenCloudOS/OpenCloudOS-hardened-cc1 -fstack-protector-strong  -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -I/usr/lib/gfortran/modules'
+ export FCFLAGS
+ LDFLAGS='-Wl,-z,relro -Wl,--as-needed  -Wl,-z,now -specs=/usr/lib/rpm/OpenCloudOS/OpenCloudOS-hardened-ld  -Wl,--build-id=sha1'
+ export LDFLAGS
+ LT_SYS_LIBRARY_PATH=/usr/lib:
+ export LT_SYS_LIBRARY_PATH
+ CC=gcc
+ export CC
+ CXX=g++
+ export CXX
+ cd uri_template-1.2.0
+ /usr/bin/python3 test.py
Running tests from: tests/corners.json
Explode Non-composite:
  PASS: "{token}" == 12345
  PASS: "{token*}" == 12345
  PASS: "{.token}" == .12345
  PASS: "{.token*}" == .12345
  PASS: "{/token}" == /12345
  PASS: "{/token*}" == /12345
  PASS: "{?token}" == ?token=12345
  PASS: "{?token*}" == ?token=12345
Non-string Values:
  PASS: "{positive}" == true
  PASS: "{positive*}" == true
  PASS: "{negative}" == false
  PASS: "{negative*}" == false
  PASS: "{zero}" == 0
  PASS: "{zero*}" == 0
  PASS: "{number}" == 42.24
  PASS: "{number*}" == 42.24
  PASS: "{.positive}" == .true
  PASS: "{.positive*}" == .true
  PASS: "{.negative}" == .false
  PASS: "{.negative*}" == .false
  PASS: "{.zero}" == .0
  PASS: "{.zero*}" == .0
  PASS: "{.number}" == .42.24
  PASS: "{.number*}" == .42.24
  PASS: "{/positive}" == /true
  PASS: "{/positive*}" == /true
  PASS: "{/negative}" == /false
  PASS: "{/negative*}" == /false
  PASS: "{/zero}" == /0
  PASS: "{/zero*}" == /0
  PASS: "{/number}" == /42.24
  PASS: "{/number*}" == /42.24
  PASS: "{?positive}" == ?positive=true
  PASS: "{?positive*}" == ?positive=true
  PASS: "{?negative}" == ?negative=false
  PASS: "{?negative*}" == ?negative=false
  PASS: "{?zero}" == ?zero=0
  PASS: "{?zero*}" == ?zero=0
  PASS: "{?number}" == ?number=42.24
  PASS: "{?number*}" == ?number=42.24
  PASS: "{list}" == one,2,true,false,0
  PASS: "{list*}" == one,2,true,false,0
  PASS: "{.list}" == .one,2,true,false,0
  PASS: "{.list*}" == .one.2.true.false.0
  PASS: "{/list}" == /one,2,true,false,0
  PASS: "{/list*}" == /one/2/true/false/0
  PASS: "{?list}" == ?list=one,2,true,false,0
  PASS: "{?list*}" == ?list=one&list=2&list=true&list=false&list=0
  PASS: "{dict}" == one,1,two,2,positive,true,negative,false,zero,0
  PASS: "{dict*}" == one=1,two=2,positive=true,negative=false,zero=0
  PASS: "{.dict}" == .one,1,two,2,positive,true,negative,false,zero,0
  PASS: "{.dict*}" == .one=1.two=2.positive=true.negative=false.zero=0
  PASS: "{/dict}" == /one,1,two,2,positive,true,negative,false,zero,0
  PASS: "{/dict*}" == /one=1/two=2/positive=true/negative=false/zero=0
  PASS: "{?dict}" == ?dict=one,1,two,2,positive,true,negative,false,zero,0
  PASS: "{?dict*}" == ?one=1&two=2&positive=true&negative=false&zero=0
Illegal templates:
  PASS: "{list:1}" == Exception
  PASS: "{bad-variable}" == Exception
Running tests from: tests/extended-tests.json
Additional Examples 1:
  PASS: "{/id*}" == /person
  PASS: "{/id*}{?fields,first_name,last.name,token}" == /person?fields=id,name,picture&first_name=John&last.name=Doe&token=12345
  PASS: "/search.{format}{?q,geocode,lang,locale,page,result_type}" == /search.json?q=URI%20Templates&geocode=37.76,-122.427&lang=en&page=5
  PASS: "/test{/Some%20Thing}" == /test/foo
  PASS: "/set{?number}" == /set?number=6
  PASS: "/loc{?long,lat}" == /loc?long=37.76&lat=-122.427
  PASS: "/base{/group_id,first_name}/pages{/page,lang}{?format,q}" == /base/12345/John/pages/5/en?format=json&q=URI%20Templates
  PASS: "/sparql{?query}" == /sparql?query=PREFIX%20dc%3A%20%3Chttp%3A%2F%2Fpurl.org%2Fdc%2Felements%2F1.1%2F%3E%20SELECT%20%3Fbook%20%3Fwho%20WHERE%20%7B%20%3Fbook%20dc%3Acreator%20%3Fwho%20%7D
  PASS: "/go{?uri}" == /go?uri=http%3A%2F%2Fexample.org%2F%3Furi%3Dhttp%253A%252F%252Fexample.org%252F
  PASS: "/service{?word}" == /service?word=dr%C3%BCcken
  PASS: "/lookup{?Stra%C3%9Fe}" == /lookup?Stra%C3%9Fe=Gr%C3%BCner%20Weg
  PASS: "{random}" == %C5%A1%C3%B6%C3%A4%C5%B8%C5%93%C3%B1%C3%AA%E2%82%AC%C2%A3%C2%A5%E2%80%A1%C3%91%C3%92%C3%93%C3%94%C3%95%C3%96%C3%97%C3%98%C3%99%C3%9A%C3%A0%C3%A1%C3%A2%C3%A3%C3%A4%C3%A5%C3%A6%C3%A7%C3%BF
  PASS: "{?assoc_special_chars*}" == ?%C5%A1%C3%B6%C3%A4%C5%B8%C5%93%C3%B1%C3%AA%E2%82%AC%C2%A3%C2%A5%E2%80%A1%C3%91%C3%92%C3%93%C3%94%C3%95=%C3%96%C3%97%C3%98%C3%99%C3%9A%C3%A0%C3%A1%C3%A2%C3%A3%C3%A4%C3%A5%C3%A6%C3%A7%C3%BF
Additional Examples 2:
  PASS: "{/id*}" == /person/albums
  PASS: "{/id*}{?fields,token}" == /person/albums?fields=id,name,picture&token=12345
Additional Examples 3: Empty Variables:
  PASS: "{/empty_list}" == 
  PASS: "{/empty_list*}" == 
  PASS: "{?empty_list}" == 
  PASS: "{?empty_list*}" == 
  PASS: "{?empty_assoc}" == 
  PASS: "{?empty_assoc*}" == 
Additional Examples 4: Numeric Keys:
  PASS: "{42}" == The%20Answer%20to%20the%20Ultimate%20Question%20of%20Life%2C%20the%20Universe%2C%20and%20Everything
  PASS: "{?42}" == ?42=The%20Answer%20to%20the%20Ultimate%20Question%20of%20Life%2C%20the%20Universe%2C%20and%20Everything
  PASS: "{1337}" == leet,as,it,can,be
  PASS: "{?1337*}" == ?1337=leet&1337=as&1337=it&1337=can&1337=be
  PASS: "{?german*}" == ?11=elf&12=zw%C3%B6lf
Additional Examples 5: Explode Combinations:
  PASS: "{?id,token,keys*}" == ?id=admin&token=12345&key1=val1&key2=val2
  PASS: "{/id}{?token,keys*}" == /admin?token=12345&key1=val1&key2=val2
  PASS: "{?id,token}{&keys*}" == ?id=admin&token=12345&key1=val1&key2=val2
  PASS: "/user{/id}{?token,tab}{&keys*}" == /user/admin?token=12345&tab=overview&key1=val1&key2=val2
Running tests from: tests/extensions.json
Nested Structures:
  PASS: "{list}" == one,two,three,four
  PASS: "{list*}" == one,two,three,four
  PASS: "{?list}" == ?list=one,two,three,four
  PASS: "{?list*}" == ?list=one&list=two&list=three&list=four
  PASS: "{lists}" == one,two,three,four
  PASS: "{lists*}" == one,two,three,four
  PASS: "{?lists}" == ?lists=one,two,three,four
  PASS: "{?lists*}" == ?lists=one&lists=two&lists=three&lists=four
  PASS: "{dict}" == semi,%3B,dot,.,comma,%2C
  PASS: "{dict*}" == semi=%3B,dot=.,comma=%2C
  PASS: "{?dict}" == ?dict=semi,%3B,dot,.,comma,%2C
  PASS: "{?dict*}" == ?semi=%3B&dot=.&comma=%2C
  PASS: "{dicts}" == one.semi,%3B,one.dot,.,two.comma,%2C
  PASS: "{dicts*}" == one.semi=%3B,one.dot=.,two.comma=%2C
  PASS: "{?dicts}" == ?dicts=one.semi,%3B,one.dot,.,two.comma,%2C
  PASS: "{?dicts*}" == ?one.semi=%3B&one.dot=.&two.comma=%2C
  PASS: "{mixed}" == list.one,list.two,list.three,dict.one.semi,%3B,dict.one.dot,.,dict.two.comma,%2C
  PASS: "{mixed*}" == list.one,list.two,list.three,dict.one.semi=%3B,dict.one.dot=.,dict.two.comma=%2C
  PASS: "{?mixed}" == ?mixed=list.one,list.two,list.three,dict.one.semi,%3B,dict.one.dot,.,dict.two.comma,%2C
  PASS: "{?mixed*}" == ?list=one&list=two&list=three&dict.one.semi=%3B&dict.one.dot=.&dict.two.comma=%2C
  PASS: "{dlist}" == semi,%3B,dot,.,comma,%2C
  PASS: "{dlist*}" == semi=%3B,dot=.,comma=%2C
  PASS: "{?dlist}" == ?dlist=semi,%3B,dot,.,comma,%2C
  PASS: "{?dlist*}" == ?dlist.semi=%3B&dlist.dot=.&dlist.comma=%2C
Array Modifier:
  PASS: "{list[]}" == one,two,three,four
  PASS: "{?list[]}" == ?list[0]=one&list[1]=two&list[2]=three&list[3]=four
  PASS: "{lists[]}" == one,two,three,four
  PASS: "{?lists[]}" == ?lists[0][0]=one&lists[0][1]=two&lists[1][0]=three&lists[2]=four
  PASS: "{dict[]}" == semi=%3B,dot=.,comma=%2C
  PASS: "{?dict[]}" == ?semi=%3B&dot=.&comma=%2C
  PASS: "{dicts[]}" == one[semi]=%3B,one[dot]=.,two[comma]=%2C
  PASS: "{?dicts[]}" == ?one[semi]=%3B&one[dot]=.&two[comma]=%2C
  PASS: "{mixed[]}" == list[0]=one,list[1][0]=two,list[1][1]=three,dict[one][semi]=%3B,dict[one][dot]=.,dict[two][comma]=%2C
  PASS: "{?mixed[]}" == ?list[0]=one&list[1][0]=two&list[1][1]=three&dict[one][semi]=%3B&dict[one][dot]=.&dict[two][comma]=%2C
  PASS: "{dlist[]}" == semi=%3B,dot=.,comma=%2C
  PASS: "{?dlist[]}" == ?dlist[0][semi]=%3B&dlist[0][dot]=.&dlist[1][comma]=%2C
Default Values:
  PASS: "{default=67890}" == 67890
  PASS: "{token,default=67890}" == 12345,67890
  PASS: "{token=fail,default=67890}" == 12345,67890
  PASS: "{default=67890,token}" == 67890,12345
  PASS: "{+default=67890}" == 67890
  PASS: "{#default=67890}" == #67890
  PASS: "{.default=67890}" == .67890
  PASS: "{/default=67890}" == /67890
  PASS: "{;default=67890}" == ;default=67890
  PASS: "{?default=67890}" == ?default=67890
  PASS: "{&default=67890}" == &default=67890
Partial Expansions:
  PASS: "{missing} partial" == {missing}
  PASS: "{missing} expanded partial == expanded" == 
  PASS: "{missing} completed partial" == abcde
  PASS: "{missing} completed partial == fully expanded" == abcde
  PASS: "{missing,also_missing} partial" == {missing,also_missing}
  PASS: "{missing,also_missing} expanded partial == expanded" == 
  PASS: "{missing,also_missing} completed partial" == abcde,fghij
  PASS: "{missing,also_missing} completed partial == fully expanded" == abcde,fghij
  PASS: "{first,missing} partial" == 12345{,missing}
  PASS: "{first,missing} expanded partial == expanded" == 12345
  PASS: "{first,missing} completed partial" == 12345,abcde
  PASS: "{first,missing} completed partial == fully expanded" == 12345,abcde
  PASS: "{missing,first} partial" == {missing,}12345
  PASS: "{missing,first} expanded partial == expanded" == 12345
  PASS: "{missing,first} completed partial" == abcde,12345
  PASS: "{missing,first} completed partial == fully expanded" == abcde,12345
  PASS: "{first,missing,second} partial" == 12345,{,missing,}67890
  PASS: "{first,missing,second} expanded partial == expanded" == 12345,67890
  PASS: "{first,missing,second} completed partial" == 12345,abcde,67890
  PASS: "{first,missing,second} completed partial == fully expanded" == 12345,abcde,67890
  PASS: "{missing,first,also_missing} partial" == {missing,}12345{,also_missing}
  PASS: "{missing,first,also_missing} expanded partial == expanded" == 12345
  PASS: "{missing,first,also_missing} completed partial" == abcde,12345,fghij
  PASS: "{missing,first,also_missing} completed partial == fully expanded" == abcde,12345,fghij
  PASS: "{first,missing,second,also_missing} partial" == 12345,{,missing,}67890{,also_missing}
  PASS: "{first,missing,second,also_missing} expanded partial == expanded" == 12345,67890
  PASS: "{first,missing,second,also_missing} completed partial" == 12345,abcde,67890,fghij
  PASS: "{first,missing,second,also_missing} completed partial == fully expanded" == 12345,abcde,67890,fghij
  PASS: "{+missing} partial" == {+missing}
  PASS: "{+missing} expanded partial == expanded" == 
  PASS: "{+missing} completed partial" == abcde
  PASS: "{+missing} completed partial == fully expanded" == abcde
  PASS: "{+missing,also_missing} partial" == {+missing,also_missing}
  PASS: "{+missing,also_missing} expanded partial == expanded" == 
  PASS: "{+missing,also_missing} completed partial" == abcde,fghij
  PASS: "{+missing,also_missing} completed partial == fully expanded" == abcde,fghij
  PASS: "{+first,missing} partial" == 12345{,+missing}
  PASS: "{+first,missing} expanded partial == expanded" == 12345
  PASS: "{+first,missing} completed partial" == 12345,abcde
  PASS: "{+first,missing} completed partial == fully expanded" == 12345,abcde
  PASS: "{+missing,first} partial" == {+missing,}12345
  PASS: "{+missing,first} expanded partial == expanded" == 12345
  PASS: "{+missing,first} completed partial" == abcde,12345
  PASS: "{+missing,first} completed partial == fully expanded" == abcde,12345
  PASS: "{+first,missing,second} partial" == 12345,{,+missing,}67890
  PASS: "{+first,missing,second} expanded partial == expanded" == 12345,67890
  PASS: "{+first,missing,second} completed partial" == 12345,abcde,67890
  PASS: "{+first,missing,second} completed partial == fully expanded" == 12345,abcde,67890
  PASS: "{+missing,first,also_missing} partial" == {+missing,}12345{,+also_missing}
  PASS: "{+missing,first,also_missing} expanded partial == expanded" == 12345
  PASS: "{+missing,first,also_missing} completed partial" == abcde,12345,fghij
  PASS: "{+missing,first,also_missing} completed partial == fully expanded" == abcde,12345,fghij
  PASS: "{+first,missing,second,also_missing} partial" == 12345,{,+missing,}67890{,+also_missing}
  PASS: "{+first,missing,second,also_missing} expanded partial == expanded" == 12345,67890
  PASS: "{+first,missing,second,also_missing} completed partial" == 12345,abcde,67890,fghij
  PASS: "{+first,missing,second,also_missing} completed partial == fully expanded" == 12345,abcde,67890,fghij
  PASS: "{#missing} partial" == {#missing}
  PASS: "{#missing} expanded partial == expanded" == 
  PASS: "{#missing} completed partial" == #abcde
  PASS: "{#missing} completed partial == fully expanded" == #abcde
  PASS: "{#missing,also_missing} partial" == {#missing,also_missing}
  PASS: "{#missing,also_missing} expanded partial == expanded" == 
  PASS: "{#missing,also_missing} completed partial" == #abcde,fghij
  PASS: "{#missing,also_missing} completed partial == fully expanded" == #abcde,fghij
  PASS: "{#first,missing} partial" == #12345{,+missing}
  PASS: "{#first,missing} expanded partial == expanded" == #12345
  PASS: "{#first,missing} completed partial" == #12345,abcde
  PASS: "{#first,missing} completed partial == fully expanded" == #12345,abcde
  PASS: "{#missing,first} partial" == #{#missing,}12345
  PASS: "{#missing,first} expanded partial == expanded" == #12345
  PASS: "{#missing,first} completed partial" == #abcde,12345
  PASS: "{#missing,first} completed partial == fully expanded" == #abcde,12345
  PASS: "{#first,missing,second} partial" == #12345,{,+missing,}67890
  PASS: "{#first,missing,second} expanded partial == expanded" == #12345,67890
  PASS: "{#first,missing,second} completed partial" == #12345,abcde,67890
  PASS: "{#first,missing,second} completed partial == fully expanded" == #12345,abcde,67890
  PASS: "{#missing,first,also_missing} partial" == #{#missing,}12345{,+also_missing}
  PASS: "{#missing,first,also_missing} expanded partial == expanded" == #12345
  PASS: "{#missing,first,also_missing} completed partial" == #abcde,12345,fghij
  PASS: "{#missing,first,also_missing} completed partial == fully expanded" == #abcde,12345,fghij
  PASS: "{#first,missing,second,also_missing} partial" == #12345,{,+missing,}67890{,+also_missing}
  PASS: "{#first,missing,second,also_missing} expanded partial == expanded" == #12345,67890
  PASS: "{#first,missing,second,also_missing} completed partial" == #12345,abcde,67890,fghij
  PASS: "{#first,missing,second,also_missing} completed partial == fully expanded" == #12345,abcde,67890,fghij
  PASS: "{.missing} partial" == {.missing}
  PASS: "{.missing} expanded partial == expanded" == 
  PASS: "{.missing} completed partial" == .abcde
  PASS: "{.missing} completed partial == fully expanded" == .abcde
  PASS: "{.missing,also_missing} partial" == {.missing,also_missing}
  PASS: "{.missing,also_missing} expanded partial == expanded" == 
  PASS: "{.missing,also_missing} completed partial" == .abcde.fghij
  PASS: "{.missing,also_missing} completed partial == fully expanded" == .abcde.fghij
  PASS: "{.first,missing} partial" == .12345{.missing}
  PASS: "{.first,missing} expanded partial == expanded" == .12345
  PASS: "{.first,missing} completed partial" == .12345.abcde
  PASS: "{.first,missing} completed partial == fully expanded" == .12345.abcde
  PASS: "{.missing,first} partial" == .{.missing.}12345
  PASS: "{.missing,first} expanded partial == expanded" == .12345
  PASS: "{.missing,first} completed partial" == .abcde.12345
  PASS: "{.missing,first} completed partial == fully expanded" == .abcde.12345
  PASS: "{.first,missing,second} partial" == .12345.{.missing.}67890
  PASS: "{.first,missing,second} expanded partial == expanded" == .12345.67890
  PASS: "{.first,missing,second} completed partial" == .12345.abcde.67890
  PASS: "{.first,missing,second} completed partial == fully expanded" == .12345.abcde.67890
  PASS: "{.missing,first,also_missing} partial" == .{.missing.}12345{.also_missing}
  PASS: "{.missing,first,also_missing} expanded partial == expanded" == .12345
  PASS: "{.missing,first,also_missing} completed partial" == .abcde.12345.fghij
  PASS: "{.missing,first,also_missing} completed partial == fully expanded" == .abcde.12345.fghij
  PASS: "{.first,missing,second,also_missing} partial" == .12345.{.missing.}67890{.also_missing}
  PASS: "{.first,missing,second,also_missing} expanded partial == expanded" == .12345.67890
  PASS: "{.first,missing,second,also_missing} completed partial" == .12345.abcde.67890.fghij
  PASS: "{.first,missing,second,also_missing} completed partial == fully expanded" == .12345.abcde.67890.fghij
  PASS: "{/missing} partial" == {/missing}
  PASS: "{/missing} expanded partial == expanded" == 
  PASS: "{/missing} completed partial" == /abcde
  PASS: "{/missing} completed partial == fully expanded" == /abcde
  PASS: "{/missing,also_missing} partial" == {/missing,also_missing}
  PASS: "{/missing,also_missing} expanded partial == expanded" == 
  PASS: "{/missing,also_missing} completed partial" == /abcde/fghij
  PASS: "{/missing,also_missing} completed partial == fully expanded" == /abcde/fghij
  PASS: "{/first,missing} partial" == /12345{/missing}
  PASS: "{/first,missing} expanded partial == expanded" == /12345
  PASS: "{/first,missing} completed partial" == /12345/abcde
  PASS: "{/first,missing} completed partial == fully expanded" == /12345/abcde
  PASS: "{/missing,first} partial" == /{/missing/}12345
  PASS: "{/missing,first} expanded partial == expanded" == /12345
  PASS: "{/missing,first} completed partial" == /abcde/12345
  PASS: "{/missing,first} completed partial == fully expanded" == /abcde/12345
  PASS: "{/first,missing,second} partial" == /12345/{/missing/}67890
  PASS: "{/first,missing,second} expanded partial == expanded" == /12345/67890
  PASS: "{/first,missing,second} completed partial" == /12345/abcde/67890
  PASS: "{/first,missing,second} completed partial == fully expanded" == /12345/abcde/67890
  PASS: "{/missing,first,also_missing} partial" == /{/missing/}12345{/also_missing}
  PASS: "{/missing,first,also_missing} expanded partial == expanded" == /12345
  PASS: "{/missing,first,also_missing} completed partial" == /abcde/12345/fghij
  PASS: "{/missing,first,also_missing} completed partial == fully expanded" == /abcde/12345/fghij
  PASS: "{/first,missing,second,also_missing} partial" == /12345/{/missing/}67890{/also_missing}
  PASS: "{/first,missing,second,also_missing} expanded partial == expanded" == /12345/67890
  PASS: "{/first,missing,second,also_missing} completed partial" == /12345/abcde/67890/fghij
  PASS: "{/first,missing,second,also_missing} completed partial == fully expanded" == /12345/abcde/67890/fghij
  PASS: "{;missing} partial" == {;missing}
  PASS: "{;missing} expanded partial == expanded" == 
  PASS: "{;missing} completed partial" == ;missing=abcde
  PASS: "{;missing} completed partial == fully expanded" == ;missing=abcde
  PASS: "{;missing,also_missing} partial" == {;missing,also_missing}
  PASS: "{;missing,also_missing} expanded partial == expanded" == 
  PASS: "{;missing,also_missing} completed partial" == ;missing=abcde;also_missing=fghij
  PASS: "{;missing,also_missing} completed partial == fully expanded" == ;missing=abcde;also_missing=fghij
  PASS: "{;first,missing} partial" == ;first=12345{;missing}
  PASS: "{;first,missing} expanded partial == expanded" == ;first=12345
  PASS: "{;first,missing} completed partial" == ;first=12345;missing=abcde
  PASS: "{;first,missing} completed partial == fully expanded" == ;first=12345;missing=abcde
  PASS: "{;missing,first} partial" == ;{;missing;}first=12345
  PASS: "{;missing,first} expanded partial == expanded" == ;first=12345
  PASS: "{;missing,first} completed partial" == ;missing=abcde;first=12345
  PASS: "{;missing,first} completed partial == fully expanded" == ;missing=abcde;first=12345
  PASS: "{;first,missing,second} partial" == ;first=12345;{;missing;}second=67890
  PASS: "{;first,missing,second} expanded partial == expanded" == ;first=12345;second=67890
  PASS: "{;first,missing,second} completed partial" == ;first=12345;missing=abcde;second=67890
  PASS: "{;first,missing,second} completed partial == fully expanded" == ;first=12345;missing=abcde;second=67890
  PASS: "{;missing,first,also_missing} partial" == ;{;missing;}first=12345{;also_missing}
  PASS: "{;missing,first,also_missing} expanded partial == expanded" == ;first=12345
  PASS: "{;missing,first,also_missing} completed partial" == ;missing=abcde;first=12345;also_missing=fghij
  PASS: "{;missing,first,also_missing} completed partial == fully expanded" == ;missing=abcde;first=12345;also_missing=fghij
  PASS: "{;first,missing,second,also_missing} partial" == ;first=12345;{;missing;}second=67890{;also_missing}
  PASS: "{;first,missing,second,also_missing} expanded partial == expanded" == ;first=12345;second=67890
  PASS: "{;first,missing,second,also_missing} completed partial" == ;first=12345;missing=abcde;second=67890;also_missing=fghij
  PASS: "{;first,missing,second,also_missing} completed partial == fully expanded" == ;first=12345;missing=abcde;second=67890;also_missing=fghij
  PASS: "{?missing} partial" == {?missing}
  PASS: "{?missing} expanded partial == expanded" == 
  PASS: "{?missing} completed partial" == ?missing=abcde
  PASS: "{?missing} completed partial == fully expanded" == ?missing=abcde
  PASS: "{?missing,also_missing} partial" == {?missing,also_missing}
  PASS: "{?missing,also_missing} expanded partial == expanded" == 
  PASS: "{?missing,also_missing} completed partial" == ?missing=abcde&also_missing=fghij
  PASS: "{?missing,also_missing} completed partial == fully expanded" == ?missing=abcde&also_missing=fghij
  PASS: "{?first,missing} partial" == ?first=12345{&missing}
  PASS: "{?first,missing} expanded partial == expanded" == ?first=12345
  PASS: "{?first,missing} completed partial" == ?first=12345&missing=abcde
  PASS: "{?first,missing} completed partial == fully expanded" == ?first=12345&missing=abcde
  PASS: "{?missing,first} partial" == ?{?missing&}first=12345
  PASS: "{?missing,first} expanded partial == expanded" == ?first=12345
  PASS: "{?missing,first} completed partial" == ?missing=abcde&first=12345
  PASS: "{?missing,first} completed partial == fully expanded" == ?missing=abcde&first=12345
  PASS: "{?first,missing,second} partial" == ?first=12345&{&missing&}second=67890
  PASS: "{?first,missing,second} expanded partial == expanded" == ?first=12345&second=67890
  PASS: "{?first,missing,second} completed partial" == ?first=12345&missing=abcde&second=67890
  PASS: "{?first,missing,second} completed partial == fully expanded" == ?first=12345&missing=abcde&second=67890
  PASS: "{?missing,first,also_missing} partial" == ?{?missing&}first=12345{&also_missing}
  PASS: "{?missing,first,also_missing} expanded partial == expanded" == ?first=12345
  PASS: "{?missing,first,also_missing} completed partial" == ?missing=abcde&first=12345&also_missing=fghij
  PASS: "{?missing,first,also_missing} completed partial == fully expanded" == ?missing=abcde&first=12345&also_missing=fghij
  PASS: "{?first,missing,second,also_missing} partial" == ?first=12345&{&missing&}second=67890{&also_missing}
  PASS: "{?first,missing,second,also_missing} expanded partial == expanded" == ?first=12345&second=67890
  PASS: "{?first,missing,second,also_missing} completed partial" == ?first=12345&missing=abcde&second=67890&also_missing=fghij
  PASS: "{?first,missing,second,also_missing} completed partial == fully expanded" == ?first=12345&missing=abcde&second=67890&also_missing=fghij
  PASS: "{&missing} partial" == {&missing}
  PASS: "{&missing} expanded partial == expanded" == 
  PASS: "{&missing} completed partial" == &missing=abcde
  PASS: "{&missing} completed partial == fully expanded" == &missing=abcde
  PASS: "{&missing,also_missing} partial" == {&missing,also_missing}
  PASS: "{&missing,also_missing} expanded partial == expanded" == 
  PASS: "{&missing,also_missing} completed partial" == &missing=abcde&also_missing=fghij
  PASS: "{&missing,also_missing} completed partial == fully expanded" == &missing=abcde&also_missing=fghij
  PASS: "{&first,missing} partial" == &first=12345{&missing}
  PASS: "{&first,missing} expanded partial == expanded" == &first=12345
  PASS: "{&first,missing} completed partial" == &first=12345&missing=abcde
  PASS: "{&first,missing} completed partial == fully expanded" == &first=12345&missing=abcde
  PASS: "{&missing,first} partial" == &{&missing&}first=12345
  PASS: "{&missing,first} expanded partial == expanded" == &first=12345
  PASS: "{&missing,first} completed partial" == &missing=abcde&first=12345
  PASS: "{&missing,first} completed partial == fully expanded" == &missing=abcde&first=12345
  PASS: "{&first,missing,second} partial" == &first=12345&{&missing&}second=67890
  PASS: "{&first,missing,second} expanded partial == expanded" == &first=12345&second=67890
  PASS: "{&first,missing,second} completed partial" == &first=12345&missing=abcde&second=67890
  PASS: "{&first,missing,second} completed partial == fully expanded" == &first=12345&missing=abcde&second=67890
  PASS: "{&missing,first,also_missing} partial" == &{&missing&}first=12345{&also_missing}
  PASS: "{&missing,first,also_missing} expanded partial == expanded" == &first=12345
  PASS: "{&missing,first,also_missing} completed partial" == &missing=abcde&first=12345&also_missing=fghij
  PASS: "{&missing,first,also_missing} completed partial == fully expanded" == &missing=abcde&first=12345&also_missing=fghij
  PASS: "{&first,missing,second,also_missing} partial" == &first=12345&{&missing&}second=67890{&also_missing}
  PASS: "{&first,missing,second,also_missing} expanded partial == expanded" == &first=12345&second=67890
  PASS: "{&first,missing,second,also_missing} completed partial" == &first=12345&missing=abcde&second=67890&also_missing=fghij
  PASS: "{&first,missing,second,also_missing} completed partial == fully expanded" == &first=12345&missing=abcde&second=67890&also_missing=fghij
Running tests from: tests/negative-tests.json
Failure Tests:
  PASS: "{/id*" == Exception
  PASS: "/id*}" == Exception
  PASS: "{/?id}" == Exception
  PASS: "{var:prefix}" == Exception
  PASS: "{hello:2*}" == Exception
  PASS: "{??hello}" == Exception
  PASS: "{!hello}" == Exception
  PASS: "{with space}" == Exception
  PASS: "{ leading_space}" == Exception
  PASS: "{trailing_space }" == Exception
  PASS: "{=path}" == Exception
  PASS: "{$var}" == Exception
  PASS: "{|var*}" == Exception
  PASS: "{*keys?}" == Exception
  PASS: "{var}{-prefix|/-/|var}" == Exception
  PASS: "?q={searchTerms}&amp;c={example:color?}" == Exception
  PASS: "x{?empty|foo=none}" == Exception
  PASS: "/h{#hello+}" == Exception
  PASS: "/h#{hello+}" == Exception
  PASS: "{keys:1}" == Exception
  PASS: "{+keys:1}" == Exception
  PASS: "{;keys:1*}" == Exception
  PASS: "?{-join|&|var,list}" == Exception
  PASS: "/people/{~thing}" == Exception
  PASS: "/{default-graph-uri}" == Exception
  PASS: "/sparql{?query,default-graph-uri}" == Exception
  PASS: "/sparql{?query){&default-graph-uri*}" == Exception
  PASS: "/resolution{?x, y}" == Exception
Running tests from: tests/spec-examples-by-section.json
3.2.1 Variable Expansion:
  PASS: "{count}" == one,two,three
  PASS: "{count*}" == one,two,three
  PASS: "{/count}" == /one,two,three
  PASS: "{/count*}" == /one/two/three
  PASS: "{;count}" == ;count=one,two,three
  PASS: "{;count*}" == ;count=one;count=two;count=three
  PASS: "{?count}" == ?count=one,two,three
  PASS: "{?count*}" == ?count=one&count=two&count=three
  PASS: "{&count*}" == &count=one&count=two&count=three
3.2.2 Simple String Expansion:
  PASS: "{var}" == value
  PASS: "{hello}" == Hello%20World%21
  PASS: "{half}" == 50%25
  PASS: "O{empty}X" == OX
  PASS: "O{undef}X" == OX
  PASS: "{x,y}" == 1024,768
  PASS: "{x,hello,y}" == 1024,Hello%20World%21,768
  PASS: "?{x,empty}" == ?1024,
  PASS: "?{x,undef}" == ?1024
  PASS: "?{undef,y}" == ?768
  PASS: "{var:3}" == val
  PASS: "{var:30}" == value
  PASS: "{list}" == red,green,blue
  PASS: "{list*}" == red,green,blue
  PASS: "{keys}" == semi,%3B,dot,.,comma,%2C
  PASS: "{keys*}" == semi=%3B,dot=.,comma=%2C
3.2.3 Reserved Expansion:
  PASS: "{+var}" == value
  PASS: "{/var,empty}" == /value/
  PASS: "{/var,undef}" == /value
  PASS: "{+hello}" == Hello%20World!
  PASS: "{+half}" == 50%25
  PASS: "{base}index" == http%3A%2F%2Fexample.com%2Fhome%2Findex
  PASS: "{+base}index" == http://example.com/home/index
  PASS: "O{+empty}X" == OX
  PASS: "O{+undef}X" == OX
  PASS: "{+path}/here" == /foo/bar/here
  PASS: "{+path:6}/here" == /foo/b/here
  PASS: "here?ref={+path}" == here?ref=/foo/bar
  PASS: "up{+path}{var}/here" == up/foo/barvalue/here
  PASS: "{+x,hello,y}" == 1024,Hello%20World!,768
  PASS: "{+path,x}/here" == /foo/bar,1024/here
  PASS: "{+list}" == red,green,blue
  PASS: "{+list*}" == red,green,blue
  PASS: "{+keys}" == semi,;,dot,.,comma,,
  PASS: "{+keys*}" == semi=;,dot=.,comma=,
3.2.4 Fragment Expansion:
  PASS: "{#var}" == #value
  PASS: "{#hello}" == #Hello%20World!
  PASS: "{#half}" == #50%25
  PASS: "foo{#empty}" == foo#
  PASS: "foo{#undef}" == foo
  PASS: "{#x,hello,y}" == #1024,Hello%20World!,768
  PASS: "{#path,x}/here" == #/foo/bar,1024/here
  PASS: "{#path:6}/here" == #/foo/b/here
  PASS: "{#list}" == #red,green,blue
  PASS: "{#list*}" == #red,green,blue
  PASS: "{#keys}" == #semi,;,dot,.,comma,,
3.2.5 Label Expansion with Dot-Prefix:
  PASS: "{.who}" == .fred
  PASS: "{.who,who}" == .fred.fred
  PASS: "{.half,who}" == .50%25.fred
  PASS: "www{.dom*}" == www.example.com
  PASS: "X{.var}" == X.value
  PASS: "X{.var:3}" == X.val
  PASS: "X{.empty}" == X.
  PASS: "X{.undef}" == X
  PASS: "X{.list}" == X.red,green,blue
  PASS: "X{.list*}" == X.red.green.blue
  PASS: "{#keys}" == #semi,;,dot,.,comma,,
  PASS: "{#keys*}" == #semi=;,dot=.,comma=,
  PASS: "X{.empty_keys}" == X
  PASS: "X{.empty_keys*}" == X
3.2.6 Path Segment Expansion:
  PASS: "{/who}" == /fred
  PASS: "{/who,who}" == /fred/fred
  PASS: "{/half,who}" == /50%25/fred
  PASS: "{/who,dub}" == /fred/me%2Ftoo
  PASS: "{/var}" == /value
  PASS: "{/var,empty}" == /value/
  PASS: "{/var,undef}" == /value
  PASS: "{/var,x}/here" == /value/1024/here
  PASS: "{/var:1,var}" == /v/value
  PASS: "{/list}" == /red,green,blue
  PASS: "{/list*}" == /red/green/blue
  PASS: "{/list*,path:4}" == /red/green/blue/%2Ffoo
  PASS: "{/keys}" == /semi,%3B,dot,.,comma,%2C
  PASS: "{/keys*}" == /semi=%3B/dot=./comma=%2C
3.2.7 Path-Style Parameter Expansion:
  PASS: "{;who}" == ;who=fred
  PASS: "{;half}" == ;half=50%25
  PASS: "{;empty}" == ;empty
  PASS: "{;hello:5}" == ;hello=Hello
  PASS: "{;v,empty,who}" == ;v=6;empty;who=fred
  PASS: "{;v,bar,who}" == ;v=6;who=fred
  PASS: "{;x,y}" == ;x=1024;y=768
  PASS: "{;x,y,empty}" == ;x=1024;y=768;empty
  PASS: "{;x,y,undef}" == ;x=1024;y=768
  PASS: "{;list}" == ;list=red,green,blue
  PASS: "{;list*}" == ;list=red;list=green;list=blue
  PASS: "{;keys}" == ;keys=semi,%3B,dot,.,comma,%2C
  PASS: "{;keys*}" == ;semi=%3B;dot=.;comma=%2C
3.2.8 Form-Style Query Expansion:
  PASS: "{?who}" == ?who=fred
  PASS: "{?half}" == ?half=50%25
  PASS: "{?x,y}" == ?x=1024&y=768
  PASS: "{?x,y,empty}" == ?x=1024&y=768&empty=
  PASS: "{?x,y,undef}" == ?x=1024&y=768
  PASS: "{?var:3}" == ?var=val
  PASS: "{?list}" == ?list=red,green,blue
  PASS: "{?list*}" == ?list=red&list=green&list=blue
  PASS: "{?keys}" == ?keys=semi,%3B,dot,.,comma,%2C
  PASS: "{?keys*}" == ?semi=%3B&dot=.&comma=%2C
3.2.9 Form-Style Query Continuation:
  PASS: "{&who}" == &who=fred
  PASS: "{&half}" == &half=50%25
  PASS: "?fixed=yes{&x}" == ?fixed=yes&x=1024
  PASS: "{&var:3}" == &var=val
  PASS: "{&x,y,empty}" == &x=1024&y=768&empty=
  PASS: "{&x,y,undef}" == &x=1024&y=768
  PASS: "{&list}" == &list=red,green,blue
  PASS: "{&list*}" == &list=red&list=green&list=blue
  PASS: "{&keys}" == &keys=semi,%3B,dot,.,comma,%2C
  PASS: "{&keys*}" == &semi=%3B&dot=.&comma=%2C
Running tests from: tests/spec-examples.json
Level 1 Examples:
  PASS: "{var}" == value
  PASS: "{hello}" == Hello%20World%21
Level 2 Examples:
  PASS: "{+var}" == value
  PASS: "{+hello}" == Hello%20World!
  PASS: "{+path}/here" == /foo/bar/here
  PASS: "here?ref={+path}" == here?ref=/foo/bar
Level 3 Examples:
  PASS: "map?{x,y}" == map?1024,768
  PASS: "{x,hello,y}" == 1024,Hello%20World%21,768
  PASS: "{+x,hello,y}" == 1024,Hello%20World!,768
  PASS: "{+path,x}/here" == /foo/bar,1024/here
  PASS: "{#x,hello,y}" == #1024,Hello%20World!,768
  PASS: "{#path,x}/here" == #/foo/bar,1024/here
  PASS: "X{.var}" == X.value
  PASS: "X{.x,y}" == X.1024.768
  PASS: "{/var}" == /value
  PASS: "{/var,x}/here" == /value/1024/here
  PASS: "{;x,y}" == ;x=1024;y=768
  PASS: "{;x,y,empty}" == ;x=1024;y=768;empty
  PASS: "{?x,y}" == ?x=1024&y=768
  PASS: "{?x,y,empty}" == ?x=1024&y=768&empty=
  PASS: "?fixed=yes{&x}" == ?fixed=yes&x=1024
  PASS: "{&x,y,empty}" == &x=1024&y=768&empty=
Level 4 Examples:
  PASS: "{var:3}" == val
  PASS: "{var:30}" == value
  PASS: "{list}" == red,green,blue
  PASS: "{list*}" == red,green,blue
  PASS: "{keys}" == semi,%3B,dot,.,comma,%2C
  PASS: "{keys*}" == semi=%3B,dot=.,comma=%2C
  PASS: "{+path:6}/here" == /foo/b/here
  PASS: "{+list}" == red,green,blue
  PASS: "{+list*}" == red,green,blue
  PASS: "{+keys}" == semi,;,dot,.,comma,,
  PASS: "{+keys*}" == semi=;,dot=.,comma=,
  PASS: "{#path:6}/here" == #/foo/b/here
  PASS: "{#list}" == #red,green,blue
  PASS: "{#list*}" == #red,green,blue
  PASS: "{#keys}" == #semi,;,dot,.,comma,,
  PASS: "{#keys*}" == #semi=;,dot=.,comma=,
  PASS: "X{.var:3}" == X.val
  PASS: "X{.list}" == X.red,green,blue
  PASS: "X{.list*}" == X.red.green.blue
  PASS: "X{.keys}" == X.semi,%3B,dot,.,comma,%2C
  PASS: "{/var:1,var}" == /v/value
  PASS: "{/list}" == /red,green,blue
  PASS: "{/list*}" == /red/green/blue
  PASS: "{/list*,path:4}" == /red/green/blue/%2Ffoo
  PASS: "{/keys}" == /semi,%3B,dot,.,comma,%2C
  PASS: "{/keys*}" == /semi=%3B/dot=./comma=%2C
  PASS: "{;hello:5}" == ;hello=Hello
  PASS: "{;list}" == ;list=red,green,blue
  PASS: "{;list*}" == ;list=red;list=green;list=blue
  PASS: "{;keys}" == ;keys=semi,%3B,dot,.,comma,%2C
  PASS: "{;keys*}" == ;semi=%3B;dot=.;comma=%2C
  PASS: "{?var:3}" == ?var=val
  PASS: "{?list}" == ?list=red,green,blue
  PASS: "{?list*}" == ?list=red&list=green&list=blue
  PASS: "{?keys}" == ?keys=semi,%3B,dot,.,comma,%2C
  PASS: "{?keys*}" == ?semi=%3B&dot=.&comma=%2C
  PASS: "{&var:3}" == &var=val
  PASS: "{&list}" == &list=red,green,blue
  PASS: "{&list*}" == &list=red&list=green&list=blue
  PASS: "{&keys}" == &keys=semi,%3B,dot,.,comma,%2C
  PASS: "{&keys*}" == &semi=%3B&dot=.&comma=%2C
0 failures
Processing files: python3-uri-template-1.2.0-1.oc9.noarch
Executing(%doc): /bin/sh -e /var/tmp/rpm-tmp.CHrvDm
Executing(%license): /bin/sh -e /var/tmp/rpm-tmp.Lij0ru
+ RPM_EC=0
++ jobs -p
+ exit 0
+ umask 022
+ cd /builddir/build/BUILD
+ cd uri_template-1.2.0
+ DOCDIR=/builddir/build/BUILDROOT/python-uri-template-1.2.0-1.oc9.noarch/usr/share/doc/python3-uri-template
+ export LC_ALL=C
+ LC_ALL=C
+ export DOCDIR
+ /usr/bin/mkdir -p /builddir/build/BUILDROOT/python-uri-template-1.2.0-1.oc9.noarch/usr/share/doc/python3-uri-template
+ cp -pr README.md /builddir/build/BUILDROOT/python-uri-template-1.2.0-1.oc9.noarch/usr/share/doc/python3-uri-template
+ RPM_EC=0
++ jobs -p
+ exit 0
+ umask 022
+ cd /builddir/build/BUILD
+ cd uri_template-1.2.0
+ LICENSEDIR=/builddir/build/BUILDROOT/python-uri-template-1.2.0-1.oc9.noarch/usr/share/licenses/python3-uri-template
+ export LC_ALL=C
+ LC_ALL=C
+ export LICENSEDIR
+ /usr/bin/mkdir -p /builddir/build/BUILDROOT/python-uri-template-1.2.0-1.oc9.noarch/usr/share/licenses/python3-uri-template
+ cp -pr LICENSE /builddir/build/BUILDROOT/python-uri-template-1.2.0-1.oc9.noarch/usr/share/licenses/python3-uri-template
+ RPM_EC=0
++ jobs -p
+ exit 0
Provides: python-uri-template = 1.2.0-1.oc9 python3-uri-template = 1.2.0-1.oc9 python3.11-uri-template = 1.2.0-1.oc9 python3.11dist(uri-template) = 1.2 python3dist(uri-template) = 1.2
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PartialHardlinkSets) <= 4.0.4-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Requires: python(abi) = 3.11
Obsoletes: python3.11-uri-template < 1.2.0-1.oc9
Checking for unpackaged file(s): /usr/lib/rpm/check-files /builddir/build/BUILDROOT/python-uri-template-1.2.0-1.oc9.noarch
Wrote: /builddir/build/RPMS/python3-uri-template-1.2.0-1.oc9.noarch.rpm
Child return code was: 0