forked from mkrautz/objc
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathiboutlet_test.go
109 lines (86 loc) · 2.63 KB
/
iboutlet_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
// Copyright (c) 2012 The 'objc' Package 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"
"strings"
"sync"
"testing"
"unsafe"
)
var iboutletOnce sync.Once
func registerIBOutletTestClass() {
iboutletOnce.Do(func() {
c := NewClass(IBOutletTester{})
c.AddMethod("myselfIsNil", (*IBOutletTester).MyselfIsNil)
c.AddMethod("myselfIsMyself", (*IBOutletTester).MyselfIsMyself)
RegisterClass(c)
})
}
type IBOutletTester struct {
Object `objc:"IBOutletTester : NSObject"`
Myself Object `objc:"IBOutlet"`
}
func (ibo *IBOutletTester) MyselfIsNil() bool {
return ibo.Myself == nil
}
func (ibo *IBOutletTester) MyselfIsMyself() bool {
return ibo.Myself.Pointer() == ibo.Object.Pointer()
}
const NSUTF8StringEncoding = 4
func NSStringFromString(str string) Object {
hdrp := (*reflect.StringHeader)(unsafe.Pointer(&str))
return GetClass("NSString").SendMsg("alloc").SendMsg("initWithBytes:length:encoding:", hdrp.Data, hdrp.Len, NSUTF8StringEncoding)
}
func TestIBOutletKeyValueCodingImpl(t *testing.T) {
registerIBOutletTestClass()
pool := GetClass("NSAutoreleasePool").SendMsg("alloc").SendMsg("init")
defer pool.SendMsg("release")
ibo := GetClass("IBOutletTester").SendMsg("alloc").SendMsg("init")
ibo.SendMsg("setValue:forKey:", ibo, NSStringFromString("Myself").AutoRelease())
if ibo.SendMsg("myselfIsNil").Bool() {
t.Fatal("nil iboutlet, value not properly set for key")
}
if !ibo.SendMsg("myselfIsMyself").Bool() {
t.Fatal("value not set, or incorrectly set.")
}
}
func TestIBOutletSetter(t *testing.T) {
registerIBOutletTestClass()
pool := GetClass("NSAutoreleasePool").SendMsg("alloc").SendMsg("init")
defer pool.SendMsg("release")
ibo := GetClass("IBOutletTester").SendMsg("alloc").SendMsg("init")
ibo.SendMsg("setMyself:", ibo)
if ibo.SendMsg("myselfIsNil").Bool() {
t.Fatal("nil iboutlet, value not properly set for key")
}
if !ibo.SendMsg("myselfIsMyself").Bool() {
t.Fatal("value not set, or incorrectly set.")
}
}
type Shadow struct {
Object `objc:"Shadow : NSObject"`
Number Object `objc:"IBOutlet"`
}
func (s *Shadow) SetNumber(magicNumber Object) {
s.Number = magicNumber.Retain()
}
func TestIBOutletShadowPanic(t *testing.T) {
defer func() {
str := recover()
if str == nil {
t.Fatal("expected panic")
}
msg, ok := str.(string)
if !ok {
t.Fatal("expectd string return from recover()")
}
if !strings.Contains(msg, "would shadow IBOutlet") {
t.Fatal("expected shadow panic")
}
}()
c := NewClass(Shadow{})
c.AddMethod("setNumber:", (*Shadow).SetNumber)
RegisterClass(c)
}