| // 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{Pkg: "Foundation/NSObjectP", Name: "Hash"}, |
| name: "NSObject", |
| methods: []*Func{ |
| &Func{Sig: "hash", GoName: "Hash", Ret: &Type{Kind: Uint, Decl: "NSUInteger"}}, |
| }, |
| }, |
| { |
| ref: importers.PkgRef{Pkg: "Foundation/NSString", Name: "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) |
| } |
| } |
| } |