// Copyright 2016 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 objc

import (
	"reflect"
	"runtime"
	"testing"

	"golang.org/x/mobile/internal/importers"
)

func TestImport(t *testing.T) {
	if runtime.GOOS != "darwin" {
		t.Skipf("can only parse objc types on darwin")
	}
	tests := []struct {
		ref     importers.PkgRef
		name    string
		methods []*Func
	}{
		{
			ref:  importers.PkgRef{"Foundation/NSObjectP", "Hash"},
			name: "NSObject",
			methods: []*Func{
				&Func{Sig: "hash", GoName: "Hash", Ret: &Type{Kind: Uint, Decl: "NSUInteger"}},
			},
		},
		{
			ref:  importers.PkgRef{"Foundation/NSString", "StringWithContentsOfFileEncodingError"},
			name: "NSString",
			methods: []*Func{
				&Func{
					Sig:    "stringWithContentsOfFile:encoding:error:",
					GoName: "StringWithContentsOfFileEncodingError",
					Params: []*Param{
						&Param{Name: "path", Type: &Type{Kind: String, Decl: "NSString *"}},
						&Param{Name: "enc", Type: &Type{Kind: Uint, Decl: "NSStringEncoding"}},
						&Param{Name: "error", Type: &Type{Kind: Class, Name: "NSError", Decl: "NSError *   * _Nullable", Indirect: true}},
					},
					Ret:    &Type{Kind: 3, Decl: "NSString *"},
					Static: true,
				},
			},
		},
	}
	for _, test := range tests {
		refs := &importers.References{
			Refs:  []importers.PkgRef{test.ref},
			Names: make(map[string]struct{}),
		}
		for _, m := range test.methods {
			refs.Names[m.GoName] = struct{}{}
		}
		types, err := Import(refs)
		if err != nil {
			t.Fatal(err)
		}
		if len(types) == 0 {
			t.Fatalf("got no types, expected at least 1")
		}
		n := types[0]
		if n.Name != test.name {
			t.Errorf("got class name %s, expected %s", n.Name, test.name)
		}
	loop:
		for _, exp := range test.methods {
			for _, got := range n.AllMethods {
				if reflect.DeepEqual(exp, got) {
					continue loop
				}
			}
			for _, got := range n.Funcs {
				if reflect.DeepEqual(exp, got) {
					continue loop
				}
			}
			t.Errorf("failed to find method: %+v", exp)
		}
	}
}
