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.
Files changed (51) hide show
  1. data/.gitignore +22 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE +22 -0
  4. data/README.md +20 -0
  5. data/Rakefile +8 -0
  6. data/config.rb +79 -0
  7. data/config.ru +4 -0
  8. data/cornerstone.gemspec +22 -0
  9. data/doc_scraper.rb +51 -0
  10. data/game.js +4293 -0
  11. data/lib/assets/javascripts/cornerstone.js +4719 -0
  12. data/lib/cornerstone.rb +11 -0
  13. data/lib/cornerstone/rails.rb +5 -0
  14. data/lib/cornerstone/sprockets.rb +2 -0
  15. data/lib/cornerstone/version.rb +3 -0
  16. data/manifest.json +15 -0
  17. data/pixie.json +12 -0
  18. data/source/javascripts/_cornerstone/_object_extensions.js.coffee +108 -0
  19. data/source/javascripts/_cornerstone/array_extensions.js.coffee +570 -0
  20. data/source/javascripts/_cornerstone/bindable.js.coffee +125 -0
  21. data/source/javascripts/_cornerstone/command_stack.js.coffee +36 -0
  22. data/source/javascripts/_cornerstone/core_object.js.coffee +183 -0
  23. data/source/javascripts/_cornerstone/function_extensions.js.coffee +60 -0
  24. data/source/javascripts/_cornerstone/logging.js.coffee +19 -0
  25. data/source/javascripts/_cornerstone/matrix.js.coffee +337 -0
  26. data/source/javascripts/_cornerstone/number_extensions.js.coffee +491 -0
  27. data/source/javascripts/_cornerstone/point.js.coffee +641 -0
  28. data/source/javascripts/_cornerstone/random.js.coffee +86 -0
  29. data/source/javascripts/_cornerstone/rectangle.js.coffee +35 -0
  30. data/source/javascripts/_cornerstone/string_extensions.js.coffee +232 -0
  31. data/source/javascripts/_cornerstone/stubs.js.coffee +1042 -0
  32. data/source/javascripts/_cornerstone/uuid.js +96 -0
  33. data/source/javascripts/_test/array_extensions.coffee +173 -0
  34. data/source/javascripts/_test/bindable.coffee +68 -0
  35. data/source/javascripts/_test/command_stack.coffee +99 -0
  36. data/source/javascripts/_test/core_object.coffee +95 -0
  37. data/source/javascripts/_test/function_extensions.coffee +50 -0
  38. data/source/javascripts/_test/logging.coffee +7 -0
  39. data/source/javascripts/_test/matrix.coffee +174 -0
  40. data/source/javascripts/_test/number_extensions.coffee +138 -0
  41. data/source/javascripts/_test/object_extensions.coffee +53 -0
  42. data/source/javascripts/_test/point.coffee +196 -0
  43. data/source/javascripts/_test/random.coffee +22 -0
  44. data/source/javascripts/_test/rectangle.coffee +70 -0
  45. data/source/javascripts/_test/string_extensions.coffee +59 -0
  46. data/source/javascripts/cornerstone.js.coffee +1 -0
  47. data/source/javascripts/cornerstone_tests.js.coffee +2 -0
  48. data/source/test.html.haml +13 -0
  49. data/vendor/javascripts/qunit.js +1275 -0
  50. data/vendor/stylesheets/qunit.css.sass +115 -0
  51. metadata +141 -0
@@ -0,0 +1,50 @@
1
+ module "Function"
2
+
3
+ test "#once", ->
4
+ score = 0
5
+
6
+ addScore = ->
7
+ score += 100
8
+
9
+ onceScore = addScore.once()
10
+
11
+ 100.times ->
12
+ onceScore()
13
+
14
+ equals score, 100
15
+
16
+ test "#returning", ->
17
+ x = 0
18
+ sideEffectsAdd = (a) ->
19
+ x += a
20
+
21
+ returnValue = sideEffectsAdd.returning(-1)(4)
22
+
23
+ equals x, 4
24
+ equals returnValue, -1
25
+
26
+ asyncTest "#debounce", 1, ->
27
+ fn = (-> ok true; start()).debounce(50)
28
+
29
+ # Though called multiple times the function is only triggered once
30
+ fn()
31
+ fn()
32
+ fn()
33
+
34
+ asyncTest "#delay", 2, ->
35
+ fn = (x, y) ->
36
+ equals x, 3
37
+ equals y, "testy"
38
+ start()
39
+
40
+ fn.delay 25, 3, "testy"
41
+
42
+ asyncTest "#defer", 1, ->
43
+ fn = (x) ->
44
+ equals x, 3
45
+ start()
46
+
47
+ fn.defer 3
48
+
49
+ module()
50
+
@@ -0,0 +1,7 @@
1
+ module "Logging"
2
+
3
+ test "log exists", ->
4
+ ok(log)
5
+
6
+ module()
7
+
@@ -0,0 +1,174 @@
1
+ ( ->
2
+ module "Matrix"
3
+
4
+ TOLERANCE = 0.00001
5
+
6
+ equalEnough = (expected, actual, tolerance, message) ->
7
+ message ||= "" + expected + " within " + tolerance + " of " + actual
8
+ ok(expected + tolerance >= actual && expected - tolerance <= actual, message)
9
+
10
+ matrixEqual = (m1, m2) ->
11
+ equalEnough(m1.a, m2.a, TOLERANCE)
12
+ equalEnough(m1.b, m2.b, TOLERANCE)
13
+ equalEnough(m1.c, m2.c, TOLERANCE)
14
+ equalEnough(m1.d, m2.d, TOLERANCE)
15
+ equalEnough(m1.tx, m2.tx, TOLERANCE)
16
+ equalEnough(m1.ty, m2.ty, TOLERANCE)
17
+
18
+ test "copy constructor", ->
19
+ matrix = Matrix(1, 0, 0, 1, 10, 12)
20
+
21
+ matrix2 = Matrix(matrix)
22
+
23
+ ok matrix != matrix2
24
+ matrixEqual(matrix2, matrix)
25
+
26
+ test "Matrix() (Identity)", ->
27
+ matrix = Matrix()
28
+
29
+ equals(matrix.a, 1, "a")
30
+ equals(matrix.b, 0, "b")
31
+ equals(matrix.c, 0, "c")
32
+ equals(matrix.d, 1, "d")
33
+ equals(matrix.tx, 0, "tx")
34
+ equals(matrix.ty, 0, "ty")
35
+
36
+ matrixEqual(matrix, Matrix.IDENTITY)
37
+
38
+ test "Empty", ->
39
+ matrix = Matrix(0, 0, 0, 0, 0, 0)
40
+
41
+ equals(matrix.a, 0, "a")
42
+ equals(matrix.b, 0, "b")
43
+ equals(matrix.c, 0, "c")
44
+ equals(matrix.d, 0, "d")
45
+ equals(matrix.tx, 0, "tx")
46
+ equals(matrix.ty, 0, "ty")
47
+
48
+ test "#copy", ->
49
+ matrix = Matrix(2, 0, 0, 2)
50
+
51
+ copyMatrix = matrix.copy()
52
+
53
+ matrixEqual copyMatrix, matrix
54
+
55
+ copyMatrix.a = 4
56
+
57
+ equals copyMatrix.a, 4
58
+ equals matrix.a, 2, "Old 'a' value is unchanged"
59
+
60
+ test ".scale", ->
61
+ matrix = Matrix.scale(2, 2)
62
+
63
+ equals(matrix.a, 2, "a")
64
+ equals(matrix.b, 0, "b")
65
+ equals(matrix.c, 0, "c")
66
+ equals(matrix.d, 2, "d")
67
+
68
+ matrix = Matrix.scale(3)
69
+
70
+ equals(matrix.a, 3, "a")
71
+ equals(matrix.b, 0, "b")
72
+ equals(matrix.c, 0, "c")
73
+ equals(matrix.d, 3, "d")
74
+
75
+ test ".scale (about a point)", ->
76
+ p = Point(5, 17)
77
+
78
+ transformedPoint = Matrix.scale(3, 7, p).transformPoint(p)
79
+
80
+ equals(transformedPoint.x, p.x, "Point should remain the same")
81
+ equals(transformedPoint.y, p.y, "Point should remain the same")
82
+
83
+ test "#scale (about a point)", ->
84
+ p = Point(3, 11)
85
+
86
+ transformedPoint = Matrix.IDENTITY.scale(3, 7, p).transformPoint(p)
87
+
88
+ equals(transformedPoint.x, p.x, "Point should remain the same")
89
+ equals(transformedPoint.y, p.y, "Point should remain the same")
90
+
91
+ test "#skew", ->
92
+ matrix = Matrix()
93
+
94
+ matrix = matrix.skew(0.125.turns, 0)
95
+
96
+ equals matrix.c, Math.tan(0.125.turns)
97
+
98
+ test ".rotation", ->
99
+ matrix = Matrix.rotation(Math.PI / 2)
100
+
101
+ equalEnough(matrix.a, 0, TOLERANCE)
102
+ equalEnough(matrix.b, 1, TOLERANCE)
103
+ equalEnough(matrix.c,-1, TOLERANCE)
104
+ equalEnough(matrix.d, 0, TOLERANCE)
105
+
106
+ test ".rotation (about a point)", ->
107
+ p = Point(11, 7)
108
+
109
+ transformedPoint = Matrix.rotation(Math.PI / 2, p).transformPoint(p)
110
+
111
+ equals transformedPoint.x, p.x, "Point should remain the same"
112
+ equals transformedPoint.y, p.y, "Point should remain the same"
113
+
114
+ test "#rotate (about a point)", ->
115
+ p = Point(8, 5);
116
+
117
+ transformedPoint = Matrix.IDENTITY.rotate(Math.PI / 2, p).transformPoint(p)
118
+
119
+ equals transformedPoint.x, p.x, "Point should remain the same"
120
+ equals transformedPoint.y, p.y, "Point should remain the same"
121
+
122
+ test "#inverse (Identity)", ->
123
+ matrix = Matrix().inverse()
124
+
125
+ equals(matrix.a, 1, "a")
126
+ equals(matrix.b, 0, "b")
127
+ equals(matrix.c, 0, "c")
128
+ equals(matrix.d, 1, "d")
129
+ equals(matrix.tx, 0, "tx")
130
+ equals(matrix.ty, 0, "ty")
131
+
132
+ test "#concat", ->
133
+ matrix = Matrix.rotation(Math.PI / 2).concat(Matrix.rotation(-Math.PI / 2))
134
+
135
+ matrixEqual(matrix, Matrix.IDENTITY)
136
+
137
+ test "#toString", ->
138
+ matrix = Matrix(0.5, 2, 0.5, -2, 3, 4.5)
139
+ matrixEqual eval(matrix.toString()), matrix
140
+
141
+ test "Maths", ->
142
+ a = Matrix(12, 3, 3, 1, 7, 9)
143
+ b = Matrix(3, 8, 3, 2, 1, 5)
144
+
145
+ c = a.concat(b)
146
+
147
+ equals(c.a, 60)
148
+ equals(c.b, 17)
149
+ equals(c.c, 42)
150
+ equals(c.d, 11)
151
+ equals(c.tx, 34)
152
+ equals(c.ty, 17)
153
+
154
+ test "Order of transformations should match manual concat", ->
155
+ tx = 10
156
+ ty = 5
157
+ theta = Math.PI/3
158
+ s = 2
159
+
160
+ m1 = Matrix().translate(tx, ty).scale(s).rotate(theta)
161
+ m2 = Matrix().concat(Matrix.translation(tx, ty)).concat(Matrix.scale(s)).concat(Matrix.rotation(theta))
162
+
163
+ matrixEqual(m1, m2)
164
+
165
+ test "IDENTITY is immutable", ->
166
+ identity = Matrix.IDENTITY
167
+
168
+ identity.a = 5
169
+
170
+ equals identity.a, 1
171
+
172
+ module undefined
173
+ )()
174
+
@@ -0,0 +1,138 @@
1
+ equalEnough = (expected, actual, tolerance, message) ->
2
+ message ||= "" + expected + " within " + tolerance + " of " + actual
3
+ ok(expected + tolerance >= actual && expected - tolerance <= actual, message)
4
+
5
+ module "Number"
6
+
7
+ test "#abs", ->
8
+ equals 5.abs(), 5, "(5).abs() equals 5"
9
+ equals 4.2.abs(), 4.2, "(4.2).abs() equals 4.2"
10
+ equals (-1.2).abs(), 1.2, "(-1.2).abs() equals 1.2"
11
+ equals 0.abs(), 0, "(0).abs() equals 0"
12
+
13
+ test "#ceil", ->
14
+ equals 4.9.ceil(), 5, "(4.9).floor() equals 5"
15
+ equals 4.2.ceil(), 5, "(4.2).ceil() equals 5"
16
+ equals (-1.2).ceil(), -1, "(-1.2).ceil() equals -1"
17
+ equals 3.ceil(), 3, "(3).ceil() equals 3"
18
+
19
+ test "#clamp", ->
20
+ equals 5.clamp(0, 3), 3
21
+ equals 5.clamp(-1, 0), 0
22
+ equals (-5).clamp(0, 1), 0
23
+ equals 1.clamp(0, null), 1
24
+ equals (-1).clamp(0, null), 0
25
+ equals (-10).clamp(-5, 0), -5
26
+ equals (-10).clamp(null, 0), -10
27
+ equals 50.clamp(null, 10), 10
28
+
29
+ test "#floor", ->
30
+ equals 4.9.floor(), 4, "(4.9).floor() equals 4"
31
+ equals 4.2.floor(), 4, "(4.2).floor() equals 4"
32
+ equals (-1.2).floor(), -2, "(-1.2).floor() equals -2"
33
+ equals 3.floor(), 3, "(3).floor() equals 3"
34
+
35
+ test "#round", ->
36
+ equals 4.5.round(), 5, "(4.5).round() equals 5"
37
+ equals 4.4.round(), 4, "(4.4).round() equals 4"
38
+
39
+ test "#sign", ->
40
+ equals 5.sign(), 1, "Positive number's sign is 1"
41
+ equals (-3).sign(), -1, "Negative number's sign is -1"
42
+ equals 0.sign(), 0, "Zero's sign is 0"
43
+
44
+ test "#even", ->
45
+ [0, 2, -32].each (n) ->
46
+ ok n.even(), "#{n} is even"
47
+
48
+ [1, -1, 2.2, -3.784].each (n) ->
49
+ equals n.even(), false, "#{n} is not even"
50
+
51
+ test "#odd", ->
52
+ [1, 9, -37].each (n) ->
53
+ ok n.odd(), "#{n} is odd"
54
+
55
+ [0, 32, 2.2, -1.1].each (n) ->
56
+ equals n.odd(), false, "#{n} is not odd"
57
+
58
+ test "#times", ->
59
+ n = 5
60
+ equals n.times(->), n, "returns n"
61
+
62
+ test "#times called correct amount", ->
63
+ n = 5
64
+ count = 0
65
+
66
+ n.times -> count++
67
+
68
+ equals n, count, "returns n"
69
+
70
+ test "#constrainRotation", ->
71
+ equals (Math.PI * 5).constrainRotation(), Math.PI
72
+ equals (-Math.PI * 5).constrainRotation(), -Math.PI
73
+
74
+ equals (Math.TAU/4 * 5).constrainRotation(), Math.TAU/4
75
+ equals (Math.TAU/4 * 3).constrainRotation(), -Math.TAU/4
76
+
77
+ test "#mod should have a positive result when used with a positive base and a negative number", ->
78
+ n = -3
79
+
80
+ equals n.mod(8), 5, "Should 'wrap' and be positive."
81
+
82
+ test "#primeFactors", ->
83
+
84
+ factors = 15.primeFactors()
85
+
86
+ equals factors.length, 2
87
+ equals factors[0], 3
88
+ equals factors[1], 5
89
+ equals factors.product(), 15
90
+
91
+ factors = 256.primeFactors()
92
+
93
+ equals factors.product(), 256
94
+ equals factors.length, 8
95
+ equals factors.first(), 2
96
+ equals factors.last(), 2
97
+
98
+ factors = 997.primeFactors()
99
+
100
+ equals factors.length, 1
101
+ equals factors.first(), 997
102
+ equals factors.product(), 997
103
+
104
+ equals 0.primeFactors(), undefined
105
+
106
+ factors = (-3).primeFactors()
107
+ equals factors.first(), -1
108
+ equals factors.product(), -3
109
+
110
+ test "#seconds", ->
111
+ equals 1.second, 1000
112
+ equals 3.seconds, 3000
113
+
114
+ test "#degrees", ->
115
+ equals 180.degrees, Math.PI
116
+ equals 1.degree, Math.TAU / 360
117
+
118
+ test "#rotations", ->
119
+ equals 1.rotation, Math.TAU
120
+ equals 0.5.rotations, Math.TAU / 2
121
+
122
+ test "#turns", ->
123
+ equals 1.turn, Math.TAU
124
+ equals 0.5.turns, Math.TAU / 2
125
+
126
+ test "#circularPoints", ->
127
+ points = [
128
+ Point(1, 0)
129
+ Point(0, 1)
130
+ Point(-1, 0)
131
+ Point(0, -1)
132
+ ]
133
+
134
+ 4.circularPoints (p, i) ->
135
+ equalEnough p.x, points[i].x, 0.001
136
+ equalEnough p.y, points[i].y, 0.001
137
+
138
+ module undefined
@@ -0,0 +1,53 @@
1
+ module "Object"
2
+
3
+ test "isArray", ->
4
+ array = [1,2,3]
5
+ object = {
6
+ blah: "blah"
7
+ second: "another"
8
+ }
9
+ number = 5
10
+ string = "string"
11
+
12
+ ok Object.isArray(array), "an array is an array"
13
+ ok !Object.isArray(object), "an object is not an array"
14
+ ok !Object.isArray(number), "a number is not an array"
15
+ ok !Object.isArray(string), "a string is not array"
16
+
17
+ test "isString", ->
18
+ ok Object.isString("a string"), "'a string' is a string"
19
+ ok !Object.isString([1, 2, 4]), "an array is not a string"
20
+ ok !Object.isString({key: "value"}), "an object literal is not a string"
21
+
22
+ test "reverseMerge", ->
23
+ object =
24
+ test: true
25
+ b: "b"
26
+
27
+ Object.reverseMerge object,
28
+ test: false
29
+ c: "c"
30
+
31
+ ok object.test
32
+ equals object.c, "c"
33
+
34
+ test "extend", ->
35
+ object =
36
+ test: true
37
+ b: "b"
38
+
39
+ Object.extend object,
40
+ test: false
41
+ c: "c"
42
+
43
+ equals object.test, false
44
+ equals object.b, "b"
45
+ equals object.c, "c"
46
+
47
+ test "isObject", ->
48
+ object = {}
49
+
50
+ equals Object.isObject(object), true
51
+
52
+ module()
53
+
@@ -0,0 +1,196 @@
1
+ ( ->
2
+ module "Point"
3
+
4
+ TOLERANCE = 0.00001
5
+
6
+ equalEnough = (expected, actual, tolerance, message) ->
7
+ message ||= "" + expected + " within " + tolerance + " of " + actual
8
+ ok(expected + tolerance >= actual && expected - tolerance <= actual, message)
9
+
10
+ test "copy constructor", ->
11
+ p = Point(3, 7)
12
+
13
+ p2 = Point(p)
14
+
15
+ equals p2.x, p.x
16
+ equals p2.y, p.y
17
+
18
+ test "#add", ->
19
+ p1 = Point(5, 6)
20
+ p2 = Point(7, 5)
21
+
22
+ result = p1.add(p2)
23
+
24
+ equals result.x, p1.x + p2.x
25
+ equals result.y, p1.y + p2.y
26
+
27
+ equals p1.x, 5
28
+ equals p1.y, 6
29
+ equals p2.x, 7
30
+ equals p2.y, 5
31
+
32
+ test "#add with two arguments", ->
33
+ point = Point(3, 7)
34
+ x = 2
35
+ y = 1
36
+
37
+ result = point.add(x, y)
38
+
39
+ equals result.x, point.x + x
40
+ equals result.y, point.y + y
41
+
42
+ x = 2
43
+ y = 0
44
+
45
+ result = point.add(x, y)
46
+
47
+ equals result.x, point.x + x
48
+ equals result.y, point.y + y
49
+
50
+ test "#add$", ->
51
+ p = Point(0, 0)
52
+
53
+ p.add$(Point(3, 5))
54
+
55
+ equals p.x, 3
56
+ equals p.y, 5
57
+
58
+ p.add$(2, 1)
59
+
60
+ equals p.x, 5
61
+ equals p.y, 6
62
+
63
+ test "#subtract", ->
64
+ p1 = Point(5, 6)
65
+ p2 = Point(7, 5)
66
+
67
+ result = p1.subtract(p2)
68
+
69
+ equals result.x, p1.x - p2.x
70
+ equals result.y, p1.y - p2.y
71
+
72
+ test "#subtract$", ->
73
+ p = Point(8, 6)
74
+
75
+ p.subtract$(3, 4)
76
+
77
+ equals p.x, 5
78
+ equals p.y, 2
79
+
80
+ test "#norm", ->
81
+ p = Point(2, 0)
82
+
83
+ normal = p.norm()
84
+ equals normal.x, 1
85
+
86
+ normal = p.norm(5)
87
+ equals normal.x, 5
88
+
89
+ p = Point(0, 0)
90
+
91
+ normal = p.norm()
92
+ equals normal.x, 0, "x value of norm of point(0,0) is 0"
93
+ equals normal.y, 0, "y value of norm of point(0,0) is 0"
94
+
95
+ test "#norm$", ->
96
+ p = Point(6, 8)
97
+
98
+ p.norm$(5)
99
+
100
+ equals p.x, 3
101
+ equals p.y, 4
102
+
103
+ test "#scale", ->
104
+ p = Point(5, 6)
105
+ scalar = 2
106
+
107
+ result = p.scale(scalar)
108
+
109
+ equals result.x, p.x * scalar
110
+ equals result.y, p.y * scalar
111
+
112
+ equals p.x, 5
113
+ equals p.y, 6
114
+
115
+ test "#scale$", ->
116
+ p = Point(0, 1)
117
+ scalar = 3
118
+
119
+ p.scale$(scalar)
120
+
121
+ equals p.x, 0
122
+ equals p.y, 3
123
+
124
+ test "#floor", ->
125
+ p1 = Point(7.2, 6.9)
126
+
127
+ ok Point(7, 6).equal(p1.floor())
128
+
129
+ test "#floor$", ->
130
+ p1 = Point(7.2, 6.9)
131
+
132
+ p1.floor$()
133
+
134
+ ok Point(7, 6).equal(p1)
135
+
136
+ test "#equal", ->
137
+ ok Point(7, 8).equal(Point(7, 8))
138
+
139
+ test "#magnitude", ->
140
+ equals Point(3, 4).magnitude(), 5
141
+
142
+ test "#length", ->
143
+ equals Point(0, 0).length(), 0
144
+ equals Point(-1, 0).length(), 1
145
+
146
+ test "#toString", ->
147
+ p = Point(7, 5)
148
+ ok eval(p.toString()).equal(p)
149
+
150
+ test "#clamp", ->
151
+ p = Point(10, 10)
152
+ p2 = p.clamp(5)
153
+
154
+ equals p2.length(), 5
155
+
156
+ test ".centroid", ->
157
+ centroid = Point.centroid(
158
+ Point(0, 0),
159
+ Point(10, 10),
160
+ Point(10, 0),
161
+ Point(0, 10)
162
+ )
163
+
164
+ equals centroid.x, 5
165
+ equals centroid.y, 5
166
+
167
+ test ".fromAngle", ->
168
+ p = Point.fromAngle(Math.TAU / 4)
169
+
170
+ equalEnough p.x, 0, TOLERANCE
171
+ equals p.y, 1
172
+
173
+ test ".random", ->
174
+ p = Point.random()
175
+
176
+ ok p
177
+
178
+ test ".interpolate", ->
179
+ p1 = Point(10, 7)
180
+ p2 = Point(-6, 29)
181
+
182
+ ok p1.equal(Point.interpolate(p1, p2, 0))
183
+ ok p2.equal(Point.interpolate(p1, p2, 1))
184
+
185
+ test "ZERO is immutable", ->
186
+ zero= Point.ZERO
187
+
188
+ zero.x = 5
189
+ zero.y = 2
190
+
191
+ equals zero.x, 0
192
+ equals zero.y, 0
193
+
194
+ module undefined
195
+ )()
196
+