text: from urllib.parse import urlencode
  
  from multidict import MultiDict, MultiDictProxy
  
  
  from yarl import URL
  
  # query
  
  
  def test_query_spaces():
      url = URL("http://example.com?a+b=c+d")
      assert url.query == MultiDict({"a b": "c d"})
  
  
  def test_query_empty():
      url = URL("http://example.com")
      assert isinstance(url.query, MultiDictProxy)
      assert url.query == MultiDict()
  
  
  def test_query():
      url = URL("http://example.com?a=1&b=2")
      assert url.query == MultiDict([("a", "1"), ("b", "2")])
  
  
  def test_query_repeated_args():
      url = URL("http://example.com?a=1&b=2&a=3")
      assert url.query == MultiDict([("a", "1"), ("b", "2"), ("a", "3")])
  
  
  def test_query_empty_arg():
      url = URL("http://example.com?a")
      assert url.query == MultiDict([("a", "")])
  
  
  def test_query_dont_unqoute_twice():
      sample_url = "http://base.place?" + urlencode({"a": "/////"})
      query = urlencode({"url": sample_url})
      full_url = "http://test_url.aha?" + query
  
      url = URL(full_url)
      assert url.query["url"] == sample_url
  
  
  def test_query_nonascii():
      url = URL("http://example.com?ключ=знач")
      assert url.query == MultiDict({"ключ": "знач"})
  
  
  # query separators
  
  
  def test_ampersand_as_separator():
      u = URL("http://127.0.0.1/?a=1&b=2")
      assert len(u.query) == 2
  
  
  def test_ampersand_as_value():
      u = URL("http://127.0.0.1/?a=1%26b=2")
      assert len(u.query) == 1
      assert u.query["a"] == "1&b=2"
  
  
  def test_semicolon_as_separator():
      u = URL("http://127.0.0.1/?a=1;b=2")
      assert len(u.query) == 2
  
  
  def test_semicolon_as_value():
      u = URL("http://127.0.0.1/?a=1%3Bb=2")
      assert len(u.query) == 1
      assert u.query["a"] == "1;b=2"
  