cornerstone-source 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +22 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +20 -0
- data/Rakefile +8 -0
- data/config.rb +79 -0
- data/config.ru +4 -0
- data/cornerstone.gemspec +22 -0
- data/doc_scraper.rb +51 -0
- data/game.js +4293 -0
- data/lib/assets/javascripts/cornerstone.js +4719 -0
- data/lib/cornerstone.rb +11 -0
- data/lib/cornerstone/rails.rb +5 -0
- data/lib/cornerstone/sprockets.rb +2 -0
- data/lib/cornerstone/version.rb +3 -0
- data/manifest.json +15 -0
- data/pixie.json +12 -0
- data/source/javascripts/_cornerstone/_object_extensions.js.coffee +108 -0
- data/source/javascripts/_cornerstone/array_extensions.js.coffee +570 -0
- data/source/javascripts/_cornerstone/bindable.js.coffee +125 -0
- data/source/javascripts/_cornerstone/command_stack.js.coffee +36 -0
- data/source/javascripts/_cornerstone/core_object.js.coffee +183 -0
- data/source/javascripts/_cornerstone/function_extensions.js.coffee +60 -0
- data/source/javascripts/_cornerstone/logging.js.coffee +19 -0
- data/source/javascripts/_cornerstone/matrix.js.coffee +337 -0
- data/source/javascripts/_cornerstone/number_extensions.js.coffee +491 -0
- data/source/javascripts/_cornerstone/point.js.coffee +641 -0
- data/source/javascripts/_cornerstone/random.js.coffee +86 -0
- data/source/javascripts/_cornerstone/rectangle.js.coffee +35 -0
- data/source/javascripts/_cornerstone/string_extensions.js.coffee +232 -0
- data/source/javascripts/_cornerstone/stubs.js.coffee +1042 -0
- data/source/javascripts/_cornerstone/uuid.js +96 -0
- data/source/javascripts/_test/array_extensions.coffee +173 -0
- data/source/javascripts/_test/bindable.coffee +68 -0
- data/source/javascripts/_test/command_stack.coffee +99 -0
- data/source/javascripts/_test/core_object.coffee +95 -0
- data/source/javascripts/_test/function_extensions.coffee +50 -0
- data/source/javascripts/_test/logging.coffee +7 -0
- data/source/javascripts/_test/matrix.coffee +174 -0
- data/source/javascripts/_test/number_extensions.coffee +138 -0
- data/source/javascripts/_test/object_extensions.coffee +53 -0
- data/source/javascripts/_test/point.coffee +196 -0
- data/source/javascripts/_test/random.coffee +22 -0
- data/source/javascripts/_test/rectangle.coffee +70 -0
- data/source/javascripts/_test/string_extensions.coffee +59 -0
- data/source/javascripts/cornerstone.js.coffee +1 -0
- data/source/javascripts/cornerstone_tests.js.coffee +2 -0
- data/source/test.html.haml +13 -0
- data/vendor/javascripts/qunit.js +1275 -0
- data/vendor/stylesheets/qunit.css.sass +115 -0
- metadata +141 -0
@@ -0,0 +1,96 @@
|
|
1
|
+
/*!
|
2
|
+
Math.uuid.js (v1.4)
|
3
|
+
http://www.broofa.com
|
4
|
+
mailto:robert@broofa.com
|
5
|
+
|
6
|
+
Copyright (c) 2010 Robert Kieffer
|
7
|
+
Dual licensed under the MIT and GPL licenses.
|
8
|
+
*/
|
9
|
+
|
10
|
+
/**
|
11
|
+
Generate a random uuid.
|
12
|
+
|
13
|
+
<code><pre>
|
14
|
+
// No arguments - returns RFC4122, version 4 ID
|
15
|
+
Math.uuid()
|
16
|
+
=> "92329D39-6F5C-4520-ABFC-AAB64544E172"
|
17
|
+
|
18
|
+
// One argument - returns ID of the specified length
|
19
|
+
Math.uuid(15) // 15 character ID (default base=62)
|
20
|
+
=> "VcydxgltxrVZSTV"
|
21
|
+
|
22
|
+
// Two arguments - returns ID of the specified length, and radix. (Radix must be <= 62)
|
23
|
+
Math.uuid(8, 2) // 8 character ID (base=2)
|
24
|
+
=> "01001010"
|
25
|
+
|
26
|
+
Math.uuid(8, 10) // 8 character ID (base=10)
|
27
|
+
=> "47473046"
|
28
|
+
|
29
|
+
Math.uuid(8, 16) // 8 character ID (base=16)
|
30
|
+
=> "098F4D35"
|
31
|
+
</pre></code>
|
32
|
+
|
33
|
+
@name uuid
|
34
|
+
@methodOf Math
|
35
|
+
@param length The desired number of characters
|
36
|
+
@param radix The number of allowable values for each character.
|
37
|
+
*/
|
38
|
+
(function() {
|
39
|
+
// Private array of chars to use
|
40
|
+
var CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
|
41
|
+
|
42
|
+
Math.uuid = function (len, radix) {
|
43
|
+
var chars = CHARS, uuid = [];
|
44
|
+
radix = radix || chars.length;
|
45
|
+
|
46
|
+
if (len) {
|
47
|
+
// Compact form
|
48
|
+
for (var i = 0; i < len; i++) uuid[i] = chars[0 | Math.random()*radix];
|
49
|
+
} else {
|
50
|
+
// rfc4122, version 4 form
|
51
|
+
var r;
|
52
|
+
|
53
|
+
// rfc4122 requires these characters
|
54
|
+
uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
|
55
|
+
uuid[14] = '4';
|
56
|
+
|
57
|
+
// Fill in random data. At i==19 set the high bits of clock sequence as
|
58
|
+
// per rfc4122, sec. 4.1.5
|
59
|
+
for (var i = 0; i < 36; i++) {
|
60
|
+
if (!uuid[i]) {
|
61
|
+
r = 0 | Math.random()*16;
|
62
|
+
uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
|
63
|
+
}
|
64
|
+
}
|
65
|
+
}
|
66
|
+
|
67
|
+
return uuid.join('');
|
68
|
+
};
|
69
|
+
|
70
|
+
// A more performant, but slightly bulkier, RFC4122v4 solution. We boost performance
|
71
|
+
// by minimizing calls to random()
|
72
|
+
Math.uuidFast = function() {
|
73
|
+
var chars = CHARS, uuid = new Array(36), rnd=0, r;
|
74
|
+
for (var i = 0; i < 36; i++) {
|
75
|
+
if (i==8 || i==13 || i==18 || i==23) {
|
76
|
+
uuid[i] = '-';
|
77
|
+
} else if (i==14) {
|
78
|
+
uuid[i] = '4';
|
79
|
+
} else {
|
80
|
+
if (rnd <= 0x02) rnd = 0x2000000 + (Math.random()*0x1000000)|0;
|
81
|
+
r = rnd & 0xf;
|
82
|
+
rnd = rnd >> 4;
|
83
|
+
uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
|
84
|
+
}
|
85
|
+
}
|
86
|
+
return uuid.join('');
|
87
|
+
};
|
88
|
+
|
89
|
+
// A more compact, but less performant, RFC4122v4 solution:
|
90
|
+
Math.uuidCompact = function() {
|
91
|
+
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
|
92
|
+
var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
|
93
|
+
return v.toString(16);
|
94
|
+
}).toUpperCase();
|
95
|
+
};
|
96
|
+
})();
|
@@ -0,0 +1,173 @@
|
|
1
|
+
module "Array"
|
2
|
+
|
3
|
+
test "#average", ->
|
4
|
+
equals [1, 3, 5, 7].average(), 4
|
5
|
+
|
6
|
+
test "#compact", ->
|
7
|
+
a = [0, 1, undefined, 2, null, 3, '', 4]
|
8
|
+
|
9
|
+
compacted = a.compact()
|
10
|
+
|
11
|
+
equals(compacted[0], 0)
|
12
|
+
equals(compacted[1], 1)
|
13
|
+
equals(compacted[2], 2)
|
14
|
+
equals(compacted[3], 3)
|
15
|
+
equals(compacted[4], '')
|
16
|
+
equals(compacted[5], 4)
|
17
|
+
|
18
|
+
test "#copy", ->
|
19
|
+
a = [1,2,3]
|
20
|
+
b = a.copy()
|
21
|
+
|
22
|
+
ok a != b, "Original array is not the same array as the copied one"
|
23
|
+
ok a.length == b.length, "Both arrays are the same size"
|
24
|
+
ok a[0] == b[0] && a[1] == b[1] && a[2] == b[2], "The elements of the two arrays are equal"
|
25
|
+
|
26
|
+
test "#flatten", ->
|
27
|
+
array = [[0,1], [2,3], [4,5]]
|
28
|
+
|
29
|
+
flattenedArray = array.flatten()
|
30
|
+
|
31
|
+
equals flattenedArray.length, 6, "Flattened array length should equal number of elements in sub-arrays"
|
32
|
+
equals flattenedArray.first(), 0, "First element should be first element in first sub-array"
|
33
|
+
equals flattenedArray.last(), 5, "Last element should be last element in last sub-array"
|
34
|
+
|
35
|
+
test "#rand", ->
|
36
|
+
array = [1,2,3]
|
37
|
+
|
38
|
+
ok array.indexOf(array.rand()) != -1, "Array includes randomly selected element"
|
39
|
+
ok [5].rand() == 5, "[5].rand() === 5"
|
40
|
+
ok [].rand() == undefined, "[].rand() === undefined"
|
41
|
+
|
42
|
+
test "#remove", ->
|
43
|
+
equals [1,2,3].remove(2), 2, "[1,2,3].remove(2) === 2"
|
44
|
+
equals [1,3].remove(2), undefined, "[1,3].remove(2) === undefined"
|
45
|
+
equals [1,3].remove(3), 3, "[1,3].remove(3) === 3"
|
46
|
+
|
47
|
+
array = [1,2,3]
|
48
|
+
array.remove(2)
|
49
|
+
ok array.length == 2, "array = [1,2,3]; array.remove(2); array.length === 2"
|
50
|
+
array.remove(3)
|
51
|
+
ok array.length == 1, "array = [1,3]; array.remove(3); array.length === 1"
|
52
|
+
|
53
|
+
test "#map", ->
|
54
|
+
equals [1].map((x) -> return x + 1 )[0], 2
|
55
|
+
|
56
|
+
test "#invoke", ->
|
57
|
+
results = ['hello', 'world', 'cool!'].invoke('substring', 0, 3)
|
58
|
+
|
59
|
+
equals results[0], "hel"
|
60
|
+
equals results[1], "wor"
|
61
|
+
equals results[2], "coo"
|
62
|
+
|
63
|
+
test "#each", ->
|
64
|
+
array = [1, 2, 3]
|
65
|
+
count = 0
|
66
|
+
|
67
|
+
equals array, array.each -> count++
|
68
|
+
equals array.length, count
|
69
|
+
|
70
|
+
test "#eachPair", ->
|
71
|
+
array = [1, 2, 3]
|
72
|
+
sum = 0
|
73
|
+
|
74
|
+
array.eachPair (a, b) ->
|
75
|
+
sum += a + b
|
76
|
+
|
77
|
+
equals(sum, 12)
|
78
|
+
|
79
|
+
test "#eachWithObject", ->
|
80
|
+
array = [1, 2, 3]
|
81
|
+
|
82
|
+
result = array.eachWithObject {}, (element, hash) ->
|
83
|
+
hash[element] = (element + 1).toString()
|
84
|
+
|
85
|
+
equals result[1], "2"
|
86
|
+
equals result[2], "3"
|
87
|
+
equals result[3], "4"
|
88
|
+
|
89
|
+
test "#shuffle", ->
|
90
|
+
array = [0, 1, 2, 3, 4, 5]
|
91
|
+
|
92
|
+
shuffledArray = array.shuffle()
|
93
|
+
|
94
|
+
shuffledArray.each (element) ->
|
95
|
+
ok array.indexOf(element) >= 0, "Every element in shuffled array is in orig array"
|
96
|
+
|
97
|
+
array.each (element) ->
|
98
|
+
ok shuffledArray.indexOf(element) >= 0, "Every element in orig array is in shuffled array"
|
99
|
+
|
100
|
+
test "#first", ->
|
101
|
+
equals [2].first(), 2
|
102
|
+
equals [1, 2, 3].first(), 1
|
103
|
+
equals [].first(), undefined
|
104
|
+
|
105
|
+
test "#last", ->
|
106
|
+
equals [2].last(), 2
|
107
|
+
equals [1, 2, 3].last(), 3
|
108
|
+
equals [].first(), undefined
|
109
|
+
|
110
|
+
test "#extremes", ->
|
111
|
+
array = [-7, 1, 11, 94]
|
112
|
+
|
113
|
+
extremes = array.extremes()
|
114
|
+
|
115
|
+
equals extremes.min, -7, "Min is -7"
|
116
|
+
equals extremes.max, 94, "Max is 94"
|
117
|
+
|
118
|
+
extremes = array.extremes (value) ->
|
119
|
+
value.mod 11
|
120
|
+
|
121
|
+
equals extremes.min, 11
|
122
|
+
equals extremes.max, 94
|
123
|
+
|
124
|
+
test "#sum", ->
|
125
|
+
equals [].sum(), 0, "Empty array sums to zero"
|
126
|
+
equals [2].sum(), 2, "[2] sums to 2"
|
127
|
+
equals [1, 2, 3, 4, 5].sum(), 15, "[1, 2, 3, 4, 5] sums to 15"
|
128
|
+
|
129
|
+
test "#eachSlice", 6, ->
|
130
|
+
[1, 2, 3, 4, 5, 6].eachSlice 2, (array) ->
|
131
|
+
equals array[0] % 2, 1
|
132
|
+
equals array[1] % 2, 0
|
133
|
+
|
134
|
+
test "#without", ->
|
135
|
+
array = [1, 2, 3, 4]
|
136
|
+
|
137
|
+
excluded = array.without([2, 4])
|
138
|
+
|
139
|
+
equals excluded[0], 1
|
140
|
+
equals excluded[1], 3
|
141
|
+
|
142
|
+
test "#clear", ->
|
143
|
+
array = [1, 2, 3, 4]
|
144
|
+
|
145
|
+
equals array.length, 4
|
146
|
+
equals array[0], 1
|
147
|
+
|
148
|
+
array.clear()
|
149
|
+
|
150
|
+
equals array.length, 0
|
151
|
+
equals array[0], undefined
|
152
|
+
|
153
|
+
test "#wrap", ->
|
154
|
+
array = [0, 1, 2, 3, 4]
|
155
|
+
|
156
|
+
equals array.wrap(0), 0
|
157
|
+
equals array.wrap(-1), 4
|
158
|
+
equals array.wrap(2), 2
|
159
|
+
|
160
|
+
test "#zip", ->
|
161
|
+
a = [1, 2, 3]
|
162
|
+
b = [4, 5, 6]
|
163
|
+
c = [7, 8]
|
164
|
+
|
165
|
+
output = a.zip(b, c)
|
166
|
+
|
167
|
+
equals output[0][0], 1
|
168
|
+
equals output[0][1], 4
|
169
|
+
equals output[0][2], 7
|
170
|
+
|
171
|
+
equals output[2][2], undefined
|
172
|
+
|
173
|
+
module undefined
|
@@ -0,0 +1,68 @@
|
|
1
|
+
module "Bindable"
|
2
|
+
|
3
|
+
test "#bind and #trigger", 1, ->
|
4
|
+
o = Core().include("Bindable")
|
5
|
+
|
6
|
+
o.bind("test", -> ok true)
|
7
|
+
|
8
|
+
o.trigger("test")
|
9
|
+
|
10
|
+
test "Multiple bindings", 2, ->
|
11
|
+
o = Core().include(Bindable)
|
12
|
+
|
13
|
+
o.bind("test", -> ok true)
|
14
|
+
o.bind("test", -> ok true)
|
15
|
+
|
16
|
+
o.trigger("test")
|
17
|
+
|
18
|
+
test "#trigger arguments", ->
|
19
|
+
o = Core().include(Bindable)
|
20
|
+
|
21
|
+
param1 = "the message"
|
22
|
+
param2 = 3
|
23
|
+
|
24
|
+
o.bind "test", (p1, p2) ->
|
25
|
+
equal(p1, param1)
|
26
|
+
equal(p2, param2)
|
27
|
+
|
28
|
+
o.trigger "test", param1, param2
|
29
|
+
|
30
|
+
test "#unbind", ->
|
31
|
+
o = Core().include("Bindable")
|
32
|
+
|
33
|
+
callback = ->
|
34
|
+
ok false
|
35
|
+
|
36
|
+
o.bind "test", callback
|
37
|
+
# Unbind specific event
|
38
|
+
o.unbind "test", callback
|
39
|
+
o.trigger "test"
|
40
|
+
|
41
|
+
o.bind "test", callback
|
42
|
+
# Unbind all events
|
43
|
+
o.unbind "test"
|
44
|
+
o.trigger "test"
|
45
|
+
|
46
|
+
test "#trigger namespace", 1, ->
|
47
|
+
o = Core().include("Bindable")
|
48
|
+
o.bind "test.TestNamespace", ->
|
49
|
+
ok true
|
50
|
+
|
51
|
+
o.trigger "test"
|
52
|
+
|
53
|
+
o.unbind ".TestNamespace"
|
54
|
+
o.trigger "test"
|
55
|
+
|
56
|
+
test "#unbind namespaced", 1, ->
|
57
|
+
o = Core().include("Bindable")
|
58
|
+
|
59
|
+
o.bind "test.TestNamespace", ->
|
60
|
+
ok true
|
61
|
+
|
62
|
+
o.trigger "test"
|
63
|
+
|
64
|
+
o.unbind ".TestNamespace", ->
|
65
|
+
o.trigger "test"
|
66
|
+
|
67
|
+
module()
|
68
|
+
|
@@ -0,0 +1,99 @@
|
|
1
|
+
module "CommandStack"
|
2
|
+
|
3
|
+
test "undo on an empty stack returns undefined", ->
|
4
|
+
commandStack = CommandStack()
|
5
|
+
|
6
|
+
equals commandStack.undo(), undefined
|
7
|
+
|
8
|
+
test "redo on an empty stack returns undefined", ->
|
9
|
+
commandStack = CommandStack()
|
10
|
+
|
11
|
+
equals commandStack.redo(), undefined
|
12
|
+
|
13
|
+
test "executes commands", 1, ->
|
14
|
+
command =
|
15
|
+
execute: ->
|
16
|
+
ok true, "command executed"
|
17
|
+
|
18
|
+
commandStack = CommandStack()
|
19
|
+
|
20
|
+
commandStack.execute command
|
21
|
+
|
22
|
+
test "can undo", 1, ->
|
23
|
+
command =
|
24
|
+
execute: ->
|
25
|
+
undo: ->
|
26
|
+
ok true, "command executed"
|
27
|
+
|
28
|
+
commandStack = CommandStack()
|
29
|
+
commandStack.execute command
|
30
|
+
|
31
|
+
commandStack.undo()
|
32
|
+
|
33
|
+
test "can redo", 2, ->
|
34
|
+
command =
|
35
|
+
execute: ->
|
36
|
+
ok true, "command executed"
|
37
|
+
undo: ->
|
38
|
+
|
39
|
+
commandStack = CommandStack()
|
40
|
+
commandStack.execute command
|
41
|
+
|
42
|
+
commandStack.undo()
|
43
|
+
commandStack.redo()
|
44
|
+
|
45
|
+
test "executes redone command once on redo", 4, ->
|
46
|
+
command =
|
47
|
+
execute: ->
|
48
|
+
ok true, "command executed"
|
49
|
+
undo: ->
|
50
|
+
|
51
|
+
commandStack = CommandStack()
|
52
|
+
commandStack.execute command
|
53
|
+
|
54
|
+
commandStack.undo()
|
55
|
+
commandStack.redo()
|
56
|
+
|
57
|
+
equals commandStack.redo(), undefined
|
58
|
+
equals commandStack.redo(), undefined
|
59
|
+
|
60
|
+
test "command is returned when undone", ->
|
61
|
+
command =
|
62
|
+
execute: ->
|
63
|
+
undo: ->
|
64
|
+
|
65
|
+
commandStack = CommandStack()
|
66
|
+
commandStack.execute command
|
67
|
+
|
68
|
+
equals commandStack.undo(), command, "Undone command is returned"
|
69
|
+
|
70
|
+
test "command is returned when redone", ->
|
71
|
+
command =
|
72
|
+
execute: ->
|
73
|
+
undo: ->
|
74
|
+
|
75
|
+
commandStack = CommandStack()
|
76
|
+
commandStack.execute command
|
77
|
+
commandStack.undo()
|
78
|
+
|
79
|
+
equals commandStack.redo(), command, "Redone command is returned"
|
80
|
+
|
81
|
+
test "cannot redo an obsolete future", ->
|
82
|
+
Command = ->
|
83
|
+
execute: ->
|
84
|
+
undo: ->
|
85
|
+
|
86
|
+
commandStack = CommandStack()
|
87
|
+
commandStack.execute Command()
|
88
|
+
commandStack.execute Command()
|
89
|
+
|
90
|
+
commandStack.undo()
|
91
|
+
commandStack.undo()
|
92
|
+
|
93
|
+
equals commandStack.canRedo(), true
|
94
|
+
|
95
|
+
commandStack.execute Command()
|
96
|
+
|
97
|
+
equals commandStack.canRedo(), false
|
98
|
+
|
99
|
+
module()
|
@@ -0,0 +1,95 @@
|
|
1
|
+
module "Core"
|
2
|
+
|
3
|
+
test "#extend", ->
|
4
|
+
o = Core()
|
5
|
+
|
6
|
+
o.extend
|
7
|
+
test: "jawsome"
|
8
|
+
|
9
|
+
equals o.test, "jawsome"
|
10
|
+
|
11
|
+
test "#attrAccessor", ->
|
12
|
+
o = Core
|
13
|
+
test: "my_val"
|
14
|
+
|
15
|
+
o.attrAccessor("test")
|
16
|
+
|
17
|
+
equals o.test(), "my_val"
|
18
|
+
equals o.test("new_val"), o
|
19
|
+
equals o.test(), "new_val"
|
20
|
+
|
21
|
+
test "#attrReader", ->
|
22
|
+
o = Core
|
23
|
+
test: "my_val"
|
24
|
+
|
25
|
+
o.attrReader("test")
|
26
|
+
|
27
|
+
equals o.test(), "my_val"
|
28
|
+
equals o.test("new_val"), "my_val"
|
29
|
+
equals o.test(), "my_val"
|
30
|
+
|
31
|
+
test "#include", ->
|
32
|
+
o = Core
|
33
|
+
test: "my_val"
|
34
|
+
|
35
|
+
M = (I, self) ->
|
36
|
+
self.attrReader "test"
|
37
|
+
|
38
|
+
test2: "cool"
|
39
|
+
|
40
|
+
ret = o.include M
|
41
|
+
|
42
|
+
equals ret, o, "Should return self"
|
43
|
+
|
44
|
+
equals o.test(), "my_val"
|
45
|
+
equals o.test2, "cool"
|
46
|
+
|
47
|
+
test "#include same module twice", 1, ->
|
48
|
+
window.M = (I, self) ->
|
49
|
+
ok(true)
|
50
|
+
|
51
|
+
test: true
|
52
|
+
|
53
|
+
o = Core()
|
54
|
+
|
55
|
+
o.include(M)
|
56
|
+
o.include(M)
|
57
|
+
|
58
|
+
test "#include multiple", ->
|
59
|
+
o = Core
|
60
|
+
test: "my_val"
|
61
|
+
|
62
|
+
M = (I, self) ->
|
63
|
+
self.attrReader "test"
|
64
|
+
|
65
|
+
test2: "cool"
|
66
|
+
|
67
|
+
M2 = (I, self) ->
|
68
|
+
test2: "coolio"
|
69
|
+
|
70
|
+
o.include M, M2
|
71
|
+
|
72
|
+
equals o.test2, "coolio"
|
73
|
+
|
74
|
+
test "#include string", ->
|
75
|
+
window.TestM = (I, self) ->
|
76
|
+
self.attrReader "test"
|
77
|
+
|
78
|
+
test2: "cool"
|
79
|
+
|
80
|
+
o = Core
|
81
|
+
test: "my_val"
|
82
|
+
|
83
|
+
o.include "TestM"
|
84
|
+
|
85
|
+
equals o.test(), "my_val"
|
86
|
+
|
87
|
+
test "#send", ->
|
88
|
+
o = Core
|
89
|
+
test: true
|
90
|
+
|
91
|
+
o.send("attrAccessor", "test")
|
92
|
+
|
93
|
+
ok(o.test())
|
94
|
+
|
95
|
+
module undefined
|