// Copyright 2012 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.

// Test method expressions with arguments.

package main

import "./method4a"

type T1 int

type T2 struct {
	f int
}

type I1 interface {
	Sum([]int, int) int
}

type I2 interface {
	Sum(a []int, b int) int
}

func (i T1) Sum(a []int, b int) int {
	r := int(i) + b
	for _, v := range a {
		r += v
	}
	return r
}

func (p *T2) Sum(a []int, b int) int {
	r := p.f + b
	for _, v := range a {
		r += v
	}
	return r
}

func eq(v1, v2 int) {
	if v1 != v2 {
		panic(0)
	}
}

func main() {
	a := []int{1, 2, 3}
	t1 := T1(4)
	t2 := &T2{4}

	eq(t1.Sum(a, 5), 15)
	eq(t2.Sum(a, 6), 16)

	eq(T1.Sum(t1, a, 7), 17)
	eq((*T2).Sum(t2, a, 8), 18)

	f1 := T1.Sum
	eq(f1(t1, a, 9), 19)
	f2 := (*T2).Sum
	eq(f2(t2, a, 10), 20)

	eq(I1.Sum(t1, a, 11), 21)
	eq(I1.Sum(t2, a, 12), 22)

	f3 := I1.Sum
	eq(f3(t1, a, 13), 23)
	eq(f3(t2, a, 14), 24)

	eq(I2.Sum(t1, a, 15), 25)
	eq(I2.Sum(t2, a, 16), 26)

	f4 := I2.Sum
	eq(f4(t1, a, 17), 27)
	eq(f4(t2, a, 18), 28)
	
	mt1 := method4a.T1(4)
	mt2 := &method4a.T2{4}

	eq(mt1.Sum(a, 30), 40)
	eq(mt2.Sum(a, 31), 41)

	eq(method4a.T1.Sum(mt1, a, 32), 42)
	eq((*method4a.T2).Sum(mt2, a, 33), 43)

	g1 := method4a.T1.Sum
	eq(g1(mt1, a, 34), 44)
	g2 := (*method4a.T2).Sum
	eq(g2(mt2, a, 35), 45)

	eq(method4a.I1.Sum(mt1, a, 36), 46)
	eq(method4a.I1.Sum(mt2, a, 37), 47)

	g3 := method4a.I1.Sum
	eq(g3(mt1, a, 38), 48)
	eq(g3(mt2, a, 39), 49)

	eq(method4a.I2.Sum(mt1, a, 40), 50)
	eq(method4a.I2.Sum(mt2, a, 41), 51)

	g4 := method4a.I2.Sum
	eq(g4(mt1, a, 42), 52)
	eq(g4(mt2, a, 43), 53)
}
