golf 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (141) hide show
  1. data/.gitignore +10 -0
  2. data/Gemfile +6 -0
  3. data/Gemfile.lock +21 -0
  4. data/Rakefile +12 -0
  5. data/bin/golf +8 -0
  6. data/golf-java/README.markdown +41 -0
  7. data/golf-java/THANKS.markdown +14 -0
  8. data/golf-java/build/classes.zip +0 -0
  9. data/golf-java/build/com/thinkminimo/golf/GolfResource$MimeMapping$MimeMappingSingleton.class +0 -0
  10. data/golf-java/build/com/thinkminimo/golf/GolfResource$MimeMapping.class +0 -0
  11. data/golf-java/build/com/thinkminimo/golf/GolfResource.class +0 -0
  12. data/golf-java/build/com/thinkminimo/golf/GolfServlet$1.class +0 -0
  13. data/golf-java/build/com/thinkminimo/golf/GolfServlet$GolfContext.class +0 -0
  14. data/golf-java/build/com/thinkminimo/golf/GolfServlet$GolfParams.class +0 -0
  15. data/golf-java/build/com/thinkminimo/golf/GolfServlet$GolfSession.class +0 -0
  16. data/golf-java/build/com/thinkminimo/golf/GolfServlet$PermanentRedirectException.class +0 -0
  17. data/golf-java/build/com/thinkminimo/golf/GolfServlet$RedirectException.class +0 -0
  18. data/golf-java/build/com/thinkminimo/golf/GolfServlet$StoredJSVM.class +0 -0
  19. data/golf-java/build/com/thinkminimo/golf/GolfServlet.class +0 -0
  20. data/golf-java/build/com/thinkminimo/golf/JsonpTunnel.class +0 -0
  21. data/golf-java/build/com/thinkminimo/golf/Main$1.class +0 -0
  22. data/golf-java/build/com/thinkminimo/golf/Main$RingList.class +0 -0
  23. data/golf-java/build/com/thinkminimo/golf/Main.class +0 -0
  24. data/golf-java/build/com/thinkminimo/golf/ProxyServlet.class +0 -0
  25. data/golf-java/build/com/yahoo/platform/yui/compressor/CssCompressor.class +0 -0
  26. data/golf-java/build/com/yahoo/platform/yui/compressor/JarClassLoader.class +0 -0
  27. data/golf-java/build/com/yahoo/platform/yui/compressor/JavaScriptCompressor.class +0 -0
  28. data/golf-java/build/com/yahoo/platform/yui/compressor/JavaScriptIdentifier.class +0 -0
  29. data/golf-java/build/com/yahoo/platform/yui/compressor/JavaScriptToken.class +0 -0
  30. data/golf-java/build/com/yahoo/platform/yui/compressor/ScriptOrFnScope.class +0 -0
  31. data/golf-java/build/depends.zip +0 -0
  32. data/golf-java/build/golf +2 -0
  33. data/golf-java/build/org/json/JSONArray.class +0 -0
  34. data/golf-java/build/org/json/JSONException.class +0 -0
  35. data/golf-java/build/org/json/JSONObject$1.class +0 -0
  36. data/golf-java/build/org/json/JSONObject$Null.class +0 -0
  37. data/golf-java/build/org/json/JSONObject.class +0 -0
  38. data/golf-java/build/org/json/JSONString.class +0 -0
  39. data/golf-java/build/org/json/JSONStringer.class +0 -0
  40. data/golf-java/build/org/json/JSONTokener.class +0 -0
  41. data/golf-java/build/org/json/JSONWriter.class +0 -0
  42. data/golf-java/build/resources.zip +0 -0
  43. data/golf-java/build.xml +174 -0
  44. data/golf-java/dist/golf.zip +0 -0
  45. data/golf-java/lib/ant-launcher.jar +0 -0
  46. data/golf-java/lib/ant.jar +0 -0
  47. data/golf-java/lib/commons-codec-1.4.jar +0 -0
  48. data/golf-java/lib/commons-collections-3.2.1.jar +0 -0
  49. data/golf-java/lib/commons-fileupload-1.2.1.jar +0 -0
  50. data/golf-java/lib/commons-httpclient-3.1.jar +0 -0
  51. data/golf-java/lib/commons-io-1.4.jar +0 -0
  52. data/golf-java/lib/commons-lang-2.4.jar +0 -0
  53. data/golf-java/lib/commons-logging-1.1.1.jar +0 -0
  54. data/golf-java/lib/cssparser-0.9.5.jar +0 -0
  55. data/golf-java/lib/getopt-0.1-dev.jar +0 -0
  56. data/golf-java/lib/htmlunit-2.6.jar +0 -0
  57. data/golf-java/lib/htmlunit-core-js-2.6.jar +0 -0
  58. data/golf-java/lib/java-xmlbuilder-1.jar +0 -0
  59. data/golf-java/lib/jets3t-0.7.0.jar +0 -0
  60. data/golf-java/lib/jetty-6.1.15.jar +0 -0
  61. data/golf-java/lib/jetty-util-6.1.15.jar +0 -0
  62. data/golf-java/lib/log4j-1.2.15.jar +0 -0
  63. data/golf-java/lib/nekohtml-1.9.13.jar +0 -0
  64. data/golf-java/lib/sac-1.3.jar +0 -0
  65. data/golf-java/lib/serializer-2.7.1.jar +0 -0
  66. data/golf-java/lib/servlet-api-2.5-20081211.jar +0 -0
  67. data/golf-java/lib/xalan-2.7.1.jar +0 -0
  68. data/golf-java/lib/xercesImpl-2.9.1.jar +0 -0
  69. data/golf-java/lib/xml-apis-1.3.04.jar +0 -0
  70. data/golf-java/resources/app_error.html +60 -0
  71. data/golf-java/resources/error.html +29 -0
  72. data/golf-java/resources/forcebot.txt +0 -0
  73. data/golf-java/resources/forceclient.txt +0 -0
  74. data/golf-java/resources/forceproxy.txt +0 -0
  75. data/golf-java/resources/head.html +0 -0
  76. data/golf-java/resources/jquery.address.js +439 -0
  77. data/golf-java/resources/jquery.golf.js +945 -0
  78. data/golf-java/resources/jquery.js +4376 -0
  79. data/golf-java/resources/jsdetect.html +23 -0
  80. data/golf-java/resources/loading.gif +0 -0
  81. data/golf-java/resources/new.html +45 -0
  82. data/golf-java/resources/new.static.html +45 -0
  83. data/golf-java/resources/noscript.forceclient.html +11 -0
  84. data/golf-java/resources/noscript.html +18 -0
  85. data/golf-java/resources/noscript.static.html +15 -0
  86. data/golf-java/resources/project.xml +21 -0
  87. data/golf-java/resources/proxy_project.xml +11 -0
  88. data/golf-java/resources/proxy_web.xml +40 -0
  89. data/golf-java/resources/static_project.xml +37 -0
  90. data/golf-java/resources/version +1 -0
  91. data/golf-java/resources/web.xml +36 -0
  92. data/golf-java/resources/welcome2golf.html +50 -0
  93. data/golf-java/src/com/thinkminimo/golf/GolfResource.java +582 -0
  94. data/golf-java/src/com/thinkminimo/golf/GolfServlet.java +1055 -0
  95. data/golf-java/src/com/thinkminimo/golf/JsonpTunnel.java +86 -0
  96. data/golf-java/src/com/thinkminimo/golf/Main.java +1299 -0
  97. data/golf-java/src/com/thinkminimo/golf/ProxyServlet.java +577 -0
  98. data/golf-java/src/com/yahoo/platform/yui/compressor/CssCompressor.java +188 -0
  99. data/golf-java/src/com/yahoo/platform/yui/compressor/JarClassLoader.java +158 -0
  100. data/golf-java/src/com/yahoo/platform/yui/compressor/JavaScriptCompressor.java +1281 -0
  101. data/golf-java/src/com/yahoo/platform/yui/compressor/JavaScriptIdentifier.java +55 -0
  102. data/golf-java/src/com/yahoo/platform/yui/compressor/JavaScriptToken.java +28 -0
  103. data/golf-java/src/com/yahoo/platform/yui/compressor/ScriptOrFnScope.java +160 -0
  104. data/golf-java/src/org/json/JSONArray.java +934 -0
  105. data/golf-java/src/org/json/JSONException.java +27 -0
  106. data/golf-java/src/org/json/JSONObject.java +1550 -0
  107. data/golf-java/src/org/json/JSONString.java +18 -0
  108. data/golf-java/src/org/json/JSONStringer.java +78 -0
  109. data/golf-java/src/org/json/JSONTokener.java +422 -0
  110. data/golf-java/src/org/json/JSONWriter.java +323 -0
  111. data/golf-java/test/client/golftest/README.markdown +3 -0
  112. data/golf-java/test/client/golftest/components/com/thinkminimo/golf/test/Harness.css +114 -0
  113. data/golf-java/test/client/golftest/components/com/thinkminimo/golf/test/Harness.html +17 -0
  114. data/golf-java/test/client/golftest/components/com/thinkminimo/golf/test/Harness.js +81 -0
  115. data/golf-java/test/client/golftest/components/com/thinkminimo/golf/test/Harness.res/asc.gif +0 -0
  116. data/golf-java/test/client/golftest/components/com/thinkminimo/golf/test/Harness.res/bg.gif +0 -0
  117. data/golf-java/test/client/golftest/components/com/thinkminimo/golf/test/Harness.res/desc.gif +0 -0
  118. data/golf-java/test/client/golftest/components/com/thinkminimo/golf/test/Harness.res/test/test.html +1 -0
  119. data/golf-java/test/client/golftest/controller.js +131 -0
  120. data/golf-java/test/client/golftest/forceclient.txt +0 -0
  121. data/golf-java/test/client/golftest/forceproxy.txt +0 -0
  122. data/golf-java/test/client/golftest/head.html +1 -0
  123. data/golf-java/test/client/golftest/scripts/jquery.tablesort.js +75 -0
  124. data/golf-java/test/client/golftest/styles/style.css +18 -0
  125. data/golf-java/test/client/golftest/test/test.html +1 -0
  126. data/golf.gemspec +24 -0
  127. data/lib/golf/cli.rb +32 -0
  128. data/lib/golf/compiler.rb +12 -0
  129. data/lib/golf/rack.rb +17 -0
  130. data/lib/golf/version.rb +3 -0
  131. data/lib/golf.rb +6 -0
  132. data/template/Gemfile +5 -0
  133. data/template/config.ru +7 -0
  134. data/template/golfapp/components/Test/Test.html +22 -0
  135. data/template/golfapp/components/Test/Test.res/myfile.txt +1 -0
  136. data/template/golfapp/controller.js +10 -0
  137. data/template/golfapp/plugins/mylib.js +12 -0
  138. data/test/test_compiler.rb +10 -0
  139. data/test/test_helper.rb +6 -0
  140. data/test/test_rack.rb +17 -0
  141. metadata +208 -0
@@ -0,0 +1,323 @@
1
+ package org.json;
2
+
3
+ import java.io.IOException;
4
+ import java.io.Writer;
5
+
6
+ /*
7
+ Copyright (c) 2006 JSON.org
8
+
9
+ Permission is hereby granted, free of charge, to any person obtaining a copy
10
+ of this software and associated documentation files (the "Software"), to deal
11
+ in the Software without restriction, including without limitation the rights
12
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
+ copies of the Software, and to permit persons to whom the Software is
14
+ furnished to do so, subject to the following conditions:
15
+
16
+ The above copyright notice and this permission notice shall be included in all
17
+ copies or substantial portions of the Software.
18
+
19
+ The Software shall be used for Good, not Evil.
20
+
21
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
27
+ SOFTWARE.
28
+ */
29
+
30
+ /**
31
+ * JSONWriter provides a quick and convenient way of producing JSON text.
32
+ * The texts produced strictly conform to JSON syntax rules. No whitespace is
33
+ * added, so the results are ready for transmission or storage. Each instance of
34
+ * JSONWriter can produce one JSON text.
35
+ * <p>
36
+ * A JSONWriter instance provides a <code>value</code> method for appending
37
+ * values to the
38
+ * text, and a <code>key</code>
39
+ * method for adding keys before values in objects. There are <code>array</code>
40
+ * and <code>endArray</code> methods that make and bound array values, and
41
+ * <code>object</code> and <code>endObject</code> methods which make and bound
42
+ * object values. All of these methods return the JSONWriter instance,
43
+ * permitting a cascade style. For example, <pre>
44
+ * new JSONWriter(myWriter)
45
+ * .object()
46
+ * .key("JSON")
47
+ * .value("Hello, World!")
48
+ * .endObject();</pre> which writes <pre>
49
+ * {"JSON":"Hello, World!"}</pre>
50
+ * <p>
51
+ * The first method called must be <code>array</code> or <code>object</code>.
52
+ * There are no methods for adding commas or colons. JSONWriter adds them for
53
+ * you. Objects and arrays can be nested up to 20 levels deep.
54
+ * <p>
55
+ * This can sometimes be easier than using a JSONObject to build a string.
56
+ * @author JSON.org
57
+ * @version 2008-09-18
58
+ */
59
+ public class JSONWriter {
60
+ private static final int maxdepth = 20;
61
+
62
+ /**
63
+ * The comma flag determines if a comma should be output before the next
64
+ * value.
65
+ */
66
+ private boolean comma;
67
+
68
+ /**
69
+ * The current mode. Values:
70
+ * 'a' (array),
71
+ * 'd' (done),
72
+ * 'i' (initial),
73
+ * 'k' (key),
74
+ * 'o' (object).
75
+ */
76
+ protected char mode;
77
+
78
+ /**
79
+ * The object/array stack.
80
+ */
81
+ private JSONObject stack[];
82
+
83
+ /**
84
+ * The stack top index. A value of 0 indicates that the stack is empty.
85
+ */
86
+ private int top;
87
+
88
+ /**
89
+ * The writer that will receive the output.
90
+ */
91
+ protected Writer writer;
92
+
93
+ /**
94
+ * Make a fresh JSONWriter. It can be used to build one JSON text.
95
+ */
96
+ public JSONWriter(Writer w) {
97
+ this.comma = false;
98
+ this.mode = 'i';
99
+ this.stack = new JSONObject[maxdepth];
100
+ this.top = 0;
101
+ this.writer = w;
102
+ }
103
+
104
+ /**
105
+ * Append a value.
106
+ * @param s A string value.
107
+ * @return this
108
+ * @throws JSONException If the value is out of sequence.
109
+ */
110
+ private JSONWriter append(String s) throws JSONException {
111
+ if (s == null) {
112
+ throw new JSONException("Null pointer");
113
+ }
114
+ if (this.mode == 'o' || this.mode == 'a') {
115
+ try {
116
+ if (this.comma && this.mode == 'a') {
117
+ this.writer.write(',');
118
+ }
119
+ this.writer.write(s);
120
+ } catch (IOException e) {
121
+ throw new JSONException(e);
122
+ }
123
+ if (this.mode == 'o') {
124
+ this.mode = 'k';
125
+ }
126
+ this.comma = true;
127
+ return this;
128
+ }
129
+ throw new JSONException("Value out of sequence.");
130
+ }
131
+
132
+ /**
133
+ * Begin appending a new array. All values until the balancing
134
+ * <code>endArray</code> will be appended to this array. The
135
+ * <code>endArray</code> method must be called to mark the array's end.
136
+ * @return this
137
+ * @throws JSONException If the nesting is too deep, or if the object is
138
+ * started in the wrong place (for example as a key or after the end of the
139
+ * outermost array or object).
140
+ */
141
+ public JSONWriter array() throws JSONException {
142
+ if (this.mode == 'i' || this.mode == 'o' || this.mode == 'a') {
143
+ this.push(null);
144
+ this.append("[");
145
+ this.comma = false;
146
+ return this;
147
+ }
148
+ throw new JSONException("Misplaced array.");
149
+ }
150
+
151
+ /**
152
+ * End something.
153
+ * @param m Mode
154
+ * @param c Closing character
155
+ * @return this
156
+ * @throws JSONException If unbalanced.
157
+ */
158
+ private JSONWriter end(char m, char c) throws JSONException {
159
+ if (this.mode != m) {
160
+ throw new JSONException(m == 'o' ? "Misplaced endObject." :
161
+ "Misplaced endArray.");
162
+ }
163
+ this.pop(m);
164
+ try {
165
+ this.writer.write(c);
166
+ } catch (IOException e) {
167
+ throw new JSONException(e);
168
+ }
169
+ this.comma = true;
170
+ return this;
171
+ }
172
+
173
+ /**
174
+ * End an array. This method most be called to balance calls to
175
+ * <code>array</code>.
176
+ * @return this
177
+ * @throws JSONException If incorrectly nested.
178
+ */
179
+ public JSONWriter endArray() throws JSONException {
180
+ return this.end('a', ']');
181
+ }
182
+
183
+ /**
184
+ * End an object. This method most be called to balance calls to
185
+ * <code>object</code>.
186
+ * @return this
187
+ * @throws JSONException If incorrectly nested.
188
+ */
189
+ public JSONWriter endObject() throws JSONException {
190
+ return this.end('k', '}');
191
+ }
192
+
193
+ /**
194
+ * Append a key. The key will be associated with the next value. In an
195
+ * object, every value must be preceded by a key.
196
+ * @param s A key string.
197
+ * @return this
198
+ * @throws JSONException If the key is out of place. For example, keys
199
+ * do not belong in arrays or if the key is null.
200
+ */
201
+ public JSONWriter key(String s) throws JSONException {
202
+ if (s == null) {
203
+ throw new JSONException("Null key.");
204
+ }
205
+ if (this.mode == 'k') {
206
+ try {
207
+ if (this.comma) {
208
+ this.writer.write(',');
209
+ }
210
+ stack[top - 1].putOnce(s, Boolean.TRUE);
211
+ this.writer.write(JSONObject.quote(s));
212
+ this.writer.write(':');
213
+ this.comma = false;
214
+ this.mode = 'o';
215
+ return this;
216
+ } catch (IOException e) {
217
+ throw new JSONException(e);
218
+ }
219
+ }
220
+ throw new JSONException("Misplaced key.");
221
+ }
222
+
223
+
224
+ /**
225
+ * Begin appending a new object. All keys and values until the balancing
226
+ * <code>endObject</code> will be appended to this object. The
227
+ * <code>endObject</code> method must be called to mark the object's end.
228
+ * @return this
229
+ * @throws JSONException If the nesting is too deep, or if the object is
230
+ * started in the wrong place (for example as a key or after the end of the
231
+ * outermost array or object).
232
+ */
233
+ public JSONWriter object() throws JSONException {
234
+ if (this.mode == 'i') {
235
+ this.mode = 'o';
236
+ }
237
+ if (this.mode == 'o' || this.mode == 'a') {
238
+ this.append("{");
239
+ this.push(new JSONObject());
240
+ this.comma = false;
241
+ return this;
242
+ }
243
+ throw new JSONException("Misplaced object.");
244
+
245
+ }
246
+
247
+
248
+ /**
249
+ * Pop an array or object scope.
250
+ * @param c The scope to close.
251
+ * @throws JSONException If nesting is wrong.
252
+ */
253
+ private void pop(char c) throws JSONException {
254
+ if (this.top <= 0) {
255
+ throw new JSONException("Nesting error.");
256
+ }
257
+ char m = this.stack[this.top - 1] == null ? 'a' : 'k';
258
+ if (m != c) {
259
+ throw new JSONException("Nesting error.");
260
+ }
261
+ this.top -= 1;
262
+ this.mode = this.top == 0 ? 'd' : this.stack[this.top - 1] == null ? 'a' : 'k';
263
+ }
264
+
265
+ /**
266
+ * Push an array or object scope.
267
+ * @param c The scope to open.
268
+ * @throws JSONException If nesting is too deep.
269
+ */
270
+ private void push(JSONObject jo) throws JSONException {
271
+ if (this.top >= maxdepth) {
272
+ throw new JSONException("Nesting too deep.");
273
+ }
274
+ this.stack[this.top] = jo;
275
+ this.mode = jo == null ? 'a' : 'k';
276
+ this.top += 1;
277
+ }
278
+
279
+
280
+ /**
281
+ * Append either the value <code>true</code> or the value
282
+ * <code>false</code>.
283
+ * @param b A boolean.
284
+ * @return this
285
+ * @throws JSONException
286
+ */
287
+ public JSONWriter value(boolean b) throws JSONException {
288
+ return this.append(b ? "true" : "false");
289
+ }
290
+
291
+ /**
292
+ * Append a double value.
293
+ * @param d A double.
294
+ * @return this
295
+ * @throws JSONException If the number is not finite.
296
+ */
297
+ public JSONWriter value(double d) throws JSONException {
298
+ return this.value(new Double(d));
299
+ }
300
+
301
+ /**
302
+ * Append a long value.
303
+ * @param l A long.
304
+ * @return this
305
+ * @throws JSONException
306
+ */
307
+ public JSONWriter value(long l) throws JSONException {
308
+ return this.append(Long.toString(l));
309
+ }
310
+
311
+
312
+ /**
313
+ * Append an object value.
314
+ * @param o The object to append. It can be null, or a Boolean, Number,
315
+ * String, JSONObject, or JSONArray, or an object with a toJSONString()
316
+ * method.
317
+ * @return this
318
+ * @throws JSONException If the value is out of sequence.
319
+ */
320
+ public JSONWriter value(Object o) throws JSONException {
321
+ return this.append(JSONObject.valueToString(o));
322
+ }
323
+ }
@@ -0,0 +1,3 @@
1
+ ## Working on this document. ##
2
+
3
+ Stay tuned...
@@ -0,0 +1,114 @@
1
+ table {
2
+ margin: 0;
3
+ padding: 0;
4
+ }
5
+
6
+ a.golfproxylink {
7
+ text-decoration: inherit;
8
+ color: inherit;
9
+ }
10
+
11
+ table.formtable {
12
+ width: 100%;
13
+ }
14
+
15
+ input.text, textarea {
16
+ width: 100%;
17
+ border: 1px solid gray;
18
+ padding: 2px;
19
+ }
20
+
21
+ input.submit, select {
22
+ width: 100%;
23
+ }
24
+
25
+ table.tests {
26
+ border: 1px solid black;
27
+ margin: 2em auto;
28
+ }
29
+
30
+ table.tests > thead > tr > th > div {
31
+ width: 100%;
32
+ padding-left: 0.25em;
33
+ text-align: left;
34
+ background-image: url('?resource=bg.gif');
35
+ background-position: center right;
36
+ background-repeat: no-repeat;
37
+ }
38
+
39
+ table.tests > thead > tr > th > div.sort-asc {
40
+ background-image: url('?resource=asc.gif');
41
+ }
42
+ table.tests > thead > tr > th > div.sort-desc {
43
+ background-image: url('?resource=desc.gif');
44
+ }
45
+
46
+ table.tests > thead > tr > th {
47
+ border-bottom: 1px solid black;
48
+ }
49
+
50
+ table.tests > thead > tr > th > * {
51
+ cursor: pointer;
52
+ }
53
+
54
+ table.tests > tbody > tr > td {
55
+ border-bottom: 1px solid gray;
56
+ border-right: 1px solid gray;
57
+ }
58
+
59
+ table.tests > tbody > tr.even {
60
+ background: #eeeeff;
61
+ }
62
+
63
+ table.tests > tbody > tr.odd {
64
+ background: #ffffff;
65
+ }
66
+
67
+ table.tests > tbody > tr > td.pass,
68
+ table.tests > tbody > tr > td.fail,
69
+ table.tests > tbody > tr > td.error,
70
+ table.tests > tbody > tr > td.none,
71
+ table.tests > tbody > tr > td.wait {
72
+ font-family: monospace;
73
+ padding: 0px 5px 0px 5px;
74
+ text-align: center;
75
+ border-right: none;
76
+ }
77
+
78
+ table.tests > tbody > tr > td.pass {
79
+ color: green;
80
+ background: lightgreen;
81
+ }
82
+
83
+ table.tests > tbody > tr > td.fail {
84
+ color: red;
85
+ background: pink;
86
+ }
87
+
88
+ table.tests > tbody > tr > td.error {
89
+ color: white;
90
+ background: red;
91
+ width: 100%;
92
+ }
93
+
94
+ table.tests > tbody > tr > td.wait {
95
+ color: red;
96
+ background: gold;
97
+ width: 100%;
98
+ }
99
+
100
+ table.tests > tbody > tr > td.none {
101
+ color: #666;
102
+ background: lightgray;
103
+ }
104
+
105
+ .testnum {
106
+ font-family: monospace;
107
+ text-align: right;
108
+ padding: 0px 5px 0px 5px;
109
+ }
110
+
111
+ .testcase {
112
+ font-family: monospace;
113
+ padding: 0px 5px 0px 5px;
114
+ }
@@ -0,0 +1,17 @@
1
+ <div>
2
+ <table class="tests" cellpadding="0px" cellspacing="0px" width="800px">
3
+ <colgroup>
4
+ <col width="5em"/>
5
+ <col width="85%"/>
6
+ <col width="15%"/>
7
+ </colgroup>
8
+ <thead>
9
+ <tr>
10
+ <th><div>#</div></th>
11
+ <th><div>test</div></th>
12
+ <th><div>result</div></th>
13
+ </tr>
14
+ </thead>
15
+ <tbody></tbody>
16
+ </table>
17
+ </div>
@@ -0,0 +1,81 @@
1
+ function() {
2
+
3
+ //----------------- public methods, instance variables -------------------//
4
+
5
+ this.test = function(name, assertion) {
6
+ var ret;
7
+
8
+ if (!name.match(/</) && !name.nodeType && !name.jquery && !name._dom)
9
+ name = $("<span/>").text(name);
10
+
11
+ $(".current").removeClass("current");
12
+
13
+ $("table.tests > tbody").append(
14
+ $("<tr/>").append(
15
+ $("<td/>").addClass("testnum").text(++tests)
16
+ ).append(
17
+ $("<td/>").addClass("testcase").append(name)
18
+ ).append(
19
+ ret = $("<td/>").addClass("current")
20
+ )
21
+ );
22
+
23
+ this.none(ret);
24
+
25
+ if (assertion !== undefined)
26
+ this.assert(assertion);
27
+
28
+ $("table.tests").trigger('sort');
29
+
30
+ return ret;
31
+ };
32
+
33
+ this.assert = function(assertion, elem) {
34
+ var result;
35
+
36
+ if (typeof(assertion) === "function") {
37
+ try {
38
+ result = assertion();
39
+ } catch (e) {
40
+ this.error(elem);
41
+ return;
42
+ }
43
+ } else if (assertion !== undefined) {
44
+ result = !!assertion;
45
+ }
46
+
47
+ this[(result === undefined ? "none" : (result ? "pass" : "fail"))](elem);
48
+ };
49
+
50
+ var comp = this;
51
+
52
+ var stats = [
53
+ { name: "none", mesg: "SKIPPED" },
54
+ { name: "pass", mesg: "PASSED" },
55
+ { name: "fail", mesg: "FAILED" },
56
+ { name: "error", mesg: "ERROR" },
57
+ { name: "wait", mesg: "WAITING" }
58
+ ];
59
+
60
+ $.each(stats, function(i_stat, v_stat) {
61
+ var mesg = v_stat.mesg;
62
+ comp[v_stat.name] = function(e) {
63
+ e = $(!!e ? e : ".current");
64
+ $.each(stats, function(k,v) { e.removeClass(v.name) });
65
+ e.addClass(v_stat.name).text(v_stat.mesg);
66
+ };
67
+ });
68
+
69
+ //----------------- private methods, instance variables ------------------//
70
+
71
+ var tests = 0;
72
+
73
+ //----------------- initialization ---------------------------------------//
74
+
75
+ $("table.tests").bind('sort', function() {
76
+ $("tbody > tr", this).not($("td table *", this)).each(function(k,v) {
77
+ $(this).removeClass(["odd","even"][k%2]).addClass(["even","odd"][k%2]);
78
+ });
79
+ }).makeSortable();
80
+
81
+ }
@@ -0,0 +1,131 @@
1
+
2
+ // import namespaces
3
+ eval($.Import("Component.com.thinkminimo.golf.test.Harness"));
4
+
5
+ // this is the default action name, in case no action was specified
6
+ $.golf.defaultRoute = "/tests/foo/bar/";
7
+
8
+ // this defines the golf controller
9
+ $.golf.controller = [
10
+
11
+ // action for the /test/something/ routes
12
+ { route: "^/tests/([^/]+)/([^/]+)/$",
13
+ action: (function() {
14
+ var t = new Harness();
15
+
16
+ return function(b, match) {
17
+ b.empty().append(t);
18
+
19
+ t.test("route regexps", function() {
20
+ return match[1] == "foo" && match[2] == "bar";
21
+ });
22
+
23
+ (function(tmp) {
24
+ t.wait(tmp);
25
+ $("form.test1").submit(function() {
26
+ t.assert(
27
+ $("[name='typeyes']").val() == "typedy type" &&
28
+ $("[name='txtarea']").val() == "this man is not to be trusted" &&
29
+ $("[name='selection']").val() == "lizards",
30
+ tmp);
31
+ $("input[type='submit']").val("Thanks!").attr("disabled", "true");
32
+ return false;
33
+ });
34
+ })(t.test(
35
+ "<form class='test1'>"+
36
+ "<table class='formtable'>"+
37
+ "<colgroup>"+
38
+ "<col width='20%'/>"+
39
+ "<col width='80%'/>"+
40
+ "</colgroup>"+
41
+ "<thead></thead>"+
42
+ "<tbody>"+
43
+ "<tr>"+
44
+ "<td>one: </td>"+
45
+ "<td>"+
46
+ "<input type='text' class='text' name='typeyes' "+
47
+ "value='typedy type' disabled='yes'/>"+
48
+ "</td>"+
49
+ "</tr><tr>"+
50
+ "<td>two: </td>"+
51
+ "<td>"+
52
+ "<textarea rows='5' name='txtarea' disabled='yes'>"+
53
+ "this man is not to be trusted"+
54
+ "</textarea>"+
55
+ "</td>"+
56
+ "</tr><tr>"+
57
+ "<td>three: </td>"+
58
+ "<td>"+
59
+ "<select name='selection' disabled='yes'>"+
60
+ "<option value='cats'>Cats</option>"+
61
+ "<option value='dogs'>Dogs</option>"+
62
+ "<option value='lizards' selected='selected'>"+
63
+ "lizards"+
64
+ "</option>"+
65
+ "</select>"+
66
+ "</td>"+
67
+ "</tr><tr>"+
68
+ "<td></td>"+
69
+ "<td>"+
70
+ "<input type='submit' class='submit' value='Click me!'/>"+
71
+ "</td>"+
72
+ "</tr>"+
73
+ "</tbody>"+
74
+ "</table>"+
75
+ "</form>"
76
+ ));
77
+
78
+ t.test("head.html");
79
+
80
+ t.test("constructor argv", (match[1] == "foo" && match[2] == "bar"));
81
+
82
+ (function(tmp) {
83
+ $.get("?path=controller.js", function(data) {
84
+ t.assert(data.length > 10, tmp);
85
+ });
86
+ })(t.test("AJAX GET"));
87
+
88
+ t.test("AJAX POST");
89
+
90
+ t.test("AJAX PUT");
91
+
92
+ t.test("AJAX DELETE");
93
+
94
+ (function(tmp) {
95
+ // flickr.com api url
96
+ var url = "http://api.flickr.com/services/feeds/photos_public.gne"+
97
+ "?tags=dogs&tagmode=any&format=json&jsoncallback=?";
98
+ t.fail(tmp);
99
+ $.getJSON(url, function(data) {
100
+ if (!data.items || data.items.length == 0)
101
+ t.error(tmp);
102
+ else
103
+ t.pass(tmp);
104
+ });
105
+ })(t.test("JSONP GET"));
106
+
107
+ (function(tmp) {
108
+ $.get($.golf.res.test["test.html"], function(data) {
109
+ t.assert(data == "PASS\n");
110
+ });
111
+ })(t.test("$.golf.res object"));
112
+
113
+ t.test("$.component.res object");
114
+ /*
115
+ $.get($.component.res.test["test.html"], function(data) {
116
+ t.assert(data == "PASS\n");
117
+ });
118
+ */
119
+ return false;
120
+ };
121
+ })()
122
+ },
123
+
124
+ // the default action
125
+ { route: ".*",
126
+ action: function(b, match) {
127
+ $.golf.location($.golf.defaultRoute);
128
+ }
129
+ }
130
+
131
+ ];
File without changes
File without changes
@@ -0,0 +1 @@
1
+ <style type="text/javascript" class="head-html">/*PASS*/</style>