// Copyright 2011 The Go Authors.  All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package main

func init() {
	addTestCases(urlTests)
}

var urlTests = []testCase{
	{
		Name: "url.0",
		In: `package main

import (
	"http"
)

func f() {
	var _ http.URL
	http.ParseURL(a)
	http.ParseURLReference(a)
	http.ParseQuery(a)
	m := http.Values{a: b}
	http.URLEscape(a)
	http.URLUnescape(a)
	var x http.URLError
	var y http.URLEscapeError
}
`,
		Out: `package main

import "url"

func f() {
	var _ url.URL
	url.Parse(a)
	url.ParseWithReference(a)
	url.ParseQuery(a)
	m := url.Values{a: b}
	url.QueryEscape(a)
	url.QueryUnescape(a)
	var x url.Error
	var y url.EscapeError
}
`,
	},
	{
		Name: "url.1",
		In: `package main

import (
	"http"
)

func f() {
	http.ParseURL(a)
	var x http.Request
}
`,
		Out: `package main

import (
	"http"
	"url"
)

func f() {
	url.Parse(a)
	var x http.Request
}
`,
	},
	{
		Name: "url.2",
		In: `package main

import (
	"http"
)

type U struct{ url int }
type M map[int]int

func f() {
	http.ParseURL(a)
	var url = 23
	url, x := 45, y
	_ = U{url: url}
	_ = M{url + 1: url}
}

func g(url string) string {
	return url
}

func h() (url string) {
	return url
}
`,
		Out: `package main

import "url"

type U struct{ url int }
type M map[int]int

func f() {
	url.Parse(a)
	var url_ = 23
	url_, x := 45, y
	_ = U{url: url_}
	_ = M{url_ + 1: url_}
}

func g(url_ string) string {
	return url_
}

func h() (url_ string) {
	return url_
}
`,
	},
	{
		Name: "url.3",
		In: `package main

import "http"

type U struct{ url string }

func f() {
	var u U
	u.url = "x"
}

func (url *T) m() string {
	return url
}
`,
		Out: `package main

import "http"

type U struct{ url string }

func f() {
	var u U
	u.url = "x"
}

func (url *T) m() string {
	return url
}
`,
	},
}
