// Copyright 2010 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

import (
	p0 "./bug0"
	p1 "./bug1"

	"reflect"
	"strings"
)

var v0 p0.T
var v1 p1.T

type I0 interface {
	M(p0.T)
}

type I1 interface {
	M(p1.T)
}

type t0 int

func (t0) M(p0.T) {}

type t1 float64

func (t1) M(p1.T) {}

var i0 I0 = t0(0) // ok
var i1 I1 = t1(0) // ok

var p0i p0.I = t0(0) // ok
var p1i p1.I = t1(0) // ok

func main() {
	// check that reflect paths are correct,
	// meaning that reflect data for v0, v1 didn't get confused.

	// path is full (rooted) path name.  check suffix for gc, prefix for gccgo
	if s := reflect.TypeOf(v0).PkgPath(); !strings.HasSuffix(s, "/bug0") && !strings.HasPrefix(s, "bug0") {
		println("bad v0 path", len(s), s)
		panic("fail")
	}
	if s := reflect.TypeOf(v1).PkgPath(); !strings.HasSuffix(s, "/bug1") && !strings.HasPrefix(s, "bug1") {
		println("bad v1 path", s)
		panic("fail")
	}

	// check that dynamic interface check doesn't get confused
	var i interface{} = t0(0)
	if _, ok := i.(I1); ok {
		println("used t0 as i1")
		panic("fail")
	}
	if _, ok := i.(p1.I); ok {
		println("used t0 as p1.I")
		panic("fail")
	}

	i = t1(1)
	if _, ok := i.(I0); ok {
		println("used t1 as i0")
		panic("fail")
	}
	if _, ok := i.(p0.I); ok {
		println("used t1 as p0.I")
		panic("fail")
	}

	// check that type switch works.
	// the worry is that if p0.T and p1.T have the same hash,
	// the binary search will handle one of them incorrectly.
	for j := 0; j < 3; j++ {
		switch j {
		case 0:
			i = p0.T{}
		case 1:
			i = p1.T{}
		case 2:
			i = 3.14
		}
		switch i.(type) {
		case p0.T:
			if j != 0 {
				println("type switch p0.T")
				panic("fail")
			}
		case p1.T:
			if j != 1 {
				println("type switch p1.T")
				panic("fail")
			}
		default:
			if j != 2 {
				println("type switch default", j)
				panic("fail")
			}
		}
	}
}
