forked from parmanoir/jscocoa
-
Notifications
You must be signed in to change notification settings - Fork 0
/
6 basic arguments.js
154 lines (100 loc) · 4.33 KB
/
6 basic arguments.js
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/*
Test int, float, bool, strings
http://stackoverflow.com/questions/1908492/unsigned-integer-in-javascript
Javascript ints are signed, therefore
1 << 31 returns a negative number
(1 << 31) >>> 0 coerces to a positive number
To get 1 << 32
(1 << 30)*4
*/
// JSCocoaController.sharedController.evalJSFile(NSBundle.mainBundle.bundlePath + '/Contents/Resources/class.js')
// Define a new class
var newClass = JSCocoaController.createClass_parentClass("BasicArgumentsTester", "NSObject")
// Test all encodings with a small float bias (0.1)
// that bias will disappear during int conversion
var encodingsToTest = ['c', 'C', 's', 'S', 'i', 'I', 'f', 'd'];
for (var i=0; i<encodingsToTest.length; i++)
{
var encoding = encodingsToTest[i]
var encodingName = reverseEncodings[encoding]
var fn = new Function('a', 'b', 'return a+b+0.1')
// var fn = new Function('a', 'b', 'JSCocoaController.log("INADD (' + encoding + ') a="+a+" b=" + b); return a+b+0.1')
var fnName = 'test' + encoding + ':' + encoding + ':'
var fnEncoding = objc_encoding.apply(null, [encodingName, encodingName, encodingName]);
JSCocoaController.addInstanceMethod_class_jsFunction_encoding(fnName, BasicArgumentsTester, fn, fnEncoding)
// JSCocoaController.log('Adding method ' + fnName + ' with encoding ' + fnEncoding)
}
var tester = BasicArgumentsTester.alloc.init
tester.release
//
// Test integer arguments
//
function testerAssert(encoding, a, b, r)
{
var res = tester['test' + encoding + ':' + encoding + ':'](a, b)
// JSCocoaController.log('r=' + r + ' res=' + res)
if (r != res) throw 'basic argument ' + encoding + ' failed : expected ' + r + ', got ' + res
}
testerAssert('c', 128, 2, -125)
testerAssert('C', 128, 2, 130)
testerAssert('s', 32768, 2, -32765)
testerAssert('S', 32768, 2, 32770)
testerAssert('i', 2147483648, 2, -2147483645)
// testerAssert('I', 2147483648, 2000, 2147483650)
// Test negative integer overflow
testerAssert('C', 0, -1, 255)
testerAssert('S', 0, -1, 65535)
testerAssert('I', 0, -1, 2147483648)
//
// Test float arguments
//
function testerFloatAssert(encoding, a, b, r)
{
var res = tester['test' + encoding + ':' + encoding + ':'](a, b)
// JSCocoaController.log('r=' + r + ' res=' + res)
if (Math.abs(r-res) > 0.001) throw 'basic argument ' + encoding + ' failed : expected ' + r + ', got ' + res
}
testerFloatAssert('f', -0.1234, 5.678, 5.6546)
testerFloatAssert('d', -0.1234, 5.678, 5.6546)
//
// Test bool
//
var encoding = 'B'
var encodingName = reverseEncodings[encoding]
var fn = new Function('a', 'b', 'return a^b')
var fnName = 'test' + encoding + ':' + encoding + ':'
var fnEncoding = objc_encoding.apply(null, [encodingName, encodingName, encodingName]);
JSCocoaController.addInstanceMethod_class_jsFunction_encoding(fnName, BasicArgumentsTester, fn, fnEncoding)
var b = tester[fnName](true, false)
if (b != true) throw 'bool failed : true^false != true'
var b = tester[fnName](false, false)
if (b != false) throw 'bool failed : false^false != false'
var b = tester[fnName](true, true)
if (b != false) throw 'bool failed : true^true != false'
//
// Test strings
//
// Test selectors
var encoding = ':'
var encodingName = reverseEncodings[encoding]
var fn = new Function('a', 'b', 'return a+b')
var fnName = 'testSEL:SEL:'
var fnEncoding = objc_encoding.apply(null, [encodingName, encodingName, encodingName]);
JSCocoaController.addInstanceMethod_class_jsFunction_encoding(fnName, BasicArgumentsTester, fn, fnEncoding)
var r = tester[fnName]('hello', 'world')
if (r != 'helloworld') throw 'string failed'
var r = tester[fnName]('トピッ', 'クス')
if (r != 'トピックス') throw 'string failed'
// Test char pointers
var encoding = '*'
var encodingName = reverseEncodings[encoding]
var fn = new Function('a', 'b', 'return a+b')
var fnName = 'testCHARPTR:CHARPTR:'
var fnEncoding = objc_encoding.apply(null, [encodingName, encodingName, encodingName]);
JSCocoaController.addInstanceMethod_class_jsFunction_encoding(fnName, BasicArgumentsTester, fn, fnEncoding)
var r = tester[fnName]('hello', 'world')
if (r != 'helloworld') throw 'string failed'
var 言葉 = tester[fnName]('トピッ', 'クス')
if (言葉 != 'トピックス') throw 'string failed'
// JSCocoaController.log('r string=' + r)
tester = null