[KSS-checkins] r46049 - in kukit/kukit.js/branch/commas-in-selectors: kukit tests
gotcha at codespeak.net
gotcha at codespeak.net
Mon Aug 27 18:59:38 CEST 2007
Author: gotcha
Date: Mon Aug 27 18:59:38 2007
New Revision: 46049
Modified:
kukit/kukit.js/branch/commas-in-selectors/kukit/kssparser.js
kukit/kukit.js/branch/commas-in-selectors/kukit/tokenizer.js
kukit/kukit.js/branch/commas-in-selectors/tests/test_kssparser.js
Log:
commas in selectors, second step
Modified: kukit/kukit.js/branch/commas-in-selectors/kukit/kssparser.js
==============================================================================
--- kukit/kukit.js/branch/commas-in-selectors/kukit/kssparser.js (original)
+++ kukit/kukit.js/branch/commas-in-selectors/kukit/kssparser.js Mon Aug 27 18:59:38 2007
@@ -50,6 +50,7 @@
});
kukit.kssp.Document.prototype.process = function() {
this.eventRules = [];
+ // Parse all tokens (including first and last)
var cursor = {'next': 0};
while (cursor.next < this.result.length) {
this.digestTxt(cursor, kukit.tk.Fraction, kukit.kssp.Comment);
@@ -69,6 +70,7 @@
var parser = new kukit.kssp.KssSelectors(src, null, true);
// check the event name and namespace use in evt- rules
// equals the event name and namespace set in the KSS selector.
+// XXX GC do not forget to check event names
// if (block.evt_name != null) {
// // We have evt- parms in the rule.
// if (block.evt_name != parser.kssSelector.name
@@ -87,8 +89,8 @@
// }
// Create the event rule. (one action only)
for(var i=0; i<parser.selectors.length; ++i) {
- var parsedSelector = parser.selectors[i];
- var eventRule = new kukit.rd.EventRule(parsedSelector.kssSelector,
+ var kssSelector = parser.selectors[i];
+ var eventRule = new kukit.rd.EventRule(kssSelector,
block.eventParameters, block.actions);
// Store the rule
this.eventRules.push(eventRule);
@@ -121,6 +123,7 @@
this.evt_name = null; // we don't know at this point
this.evt_namespace = null; // we don't know at this point
this.actions = new kukit.rd.ActionSet();
+ // Parse all tokens (except first and last)
var cursor = {'next': 1};
while (cursor.next < this.result.length-1) {
this.digestTxt(cursor, kukit.tk.Fraction, kukit.kssp.Comment);
@@ -509,6 +512,7 @@
});
kukit.kssp.MethodArgs.prototype.process = function() {
this.args = [];
+ // Parse all tokens (except first and last)
var cursor = {'next': 1};
while (cursor.next < this.result.length-1) {
this.digestTxt(cursor, kukit.tk.Fraction, kukit.kssp.Comment);
@@ -552,17 +556,14 @@
});
kukit.kssp.KssSelectors.prototype.process = function() {
this.selectors = [];
- var cursor = {'next': 1};
-
- var parser = new kukit.kssp.KssSelector(this.result[0].txt, null, true);
- this.selectors.push(parser);
-
- while (cursor.next < this.result.length-1) {
- this.digestTxt(cursor, kukit.kssp.Comment);
- var kssSelectorTxt = cursor.txt;
- this.expectToken(cursor, kukit.kssp.KssSelector);
- this.selectors.push(cursor.token);
- if (cursor.next == this.result.length-1) break;
+ // Parse all tokens (including first and last)
+ var cursor = {'next': 0};
+ while (cursor.next < this.result.length) {
+ this.digestTxt(cursor, kukit.tk.Fraction, kukit.kssp.Comment);
+ var src = new kukit.tk.Cursor(cursor.txt + ' ')
+ var parser = new kukit.kssp.KssSelector(src, null, true);
+ this.selectors.push(parser.kssSelector);
+ if (cursor.next == this.result.length) break;
this.expectToken(cursor, kukit.kssp.comma);
};
this.result = [];
Modified: kukit/kukit.js/branch/commas-in-selectors/kukit/tokenizer.js
==============================================================================
--- kukit/kukit.js/branch/commas-in-selectors/kukit/tokenizer.js (original)
+++ kukit/kukit.js/branch/commas-in-selectors/kukit/tokenizer.js Mon Aug 27 18:59:38 2007
@@ -34,9 +34,9 @@
throw kukit.E;
};
-kukit.tk._TokenBase.prototype.setSrcStatus = function(eofOk) {
+kukit.tk._TokenBase.prototype.updateFinished = function() {
if (! this.finished && this.src.text.length == this.src.pos) {
- if (eofOk) {
+ if (this.isTopLevelParser) {
this.finished = true;
} else {
;;; kukit.E = 'Unexpected EOF.';
@@ -224,19 +224,20 @@
kukit.tk.mkParser = function(symbol, table) {
// Poor man's subclassing.
- f = function(src, tokenClass, eofOk) {
+ f = function(src, tokenClass, isTopLevelParser) {
this.src = src;
this.startpos = src.pos;
this.finished = false;
+ this.isTopLevelParser = isTopLevelParser;
this.result = [];
if (tokenClass) {
// Reentry with starting token propagated.
this.result.push(new tokenClass(this.src));
}
- this.setSrcStatus(eofOk);
+ this.updateFinished();
while (!this.finished) {
this.nextStep(table);
- this.setSrcStatus(eofOk);
+ this.updateFinished();
}
this.endpos = src.pos;
// post processing
Modified: kukit/kukit.js/branch/commas-in-selectors/tests/test_kssparser.js
==============================================================================
--- kukit/kukit.js/branch/commas-in-selectors/tests/test_kssparser.js (original)
+++ kukit/kukit.js/branch/commas-in-selectors/tests/test_kssparser.js Mon Aug 27 18:59:38 2007
@@ -23,8 +23,7 @@
var kukit = {};
}
-kukit.KssParserTestCase = function() {
- this.name = 'kukit.KssParserTestCase';
+kukit.KssParserTestCaseBase = function() {
this.setUp = function() {
};
@@ -59,6 +58,12 @@
this.assertKssParmValueEquals(a[key], b[key], reason + 'mismatch at parm key ' + key);
}
};
+};
+
+kukit.KssParserTestCaseBase.prototype = new kukit.TokenizerTestCaseBase;
+
+kukit.KssParserTestCase = function() {
+ this.name = 'kukit.KssParserTestCase';
this.testPropvalueInMethod = function() {
// Parsing prop values (no methods allowed)
@@ -315,372 +320,111 @@
};
- this.testKssSelector = function() {
- // Parsing event selector params
- var txt= "a:drag(hello)";
- var src = new kukit.tk.Cursor(txt);
- var parser = new kukit.kssp.KssSelector(src, null, true);
- this.assertEquals(parser.finished, true);
- this.assertEquals(parser.kssSelector.isEventSelector, true);
- this.assertEquals(parser.kssSelector.css, 'a');
- this.assertEquals(parser.kssSelector.name, 'drag');
- this.assertEquals(parser.kssSelector.namespace, null);
- this.assertEquals(parser.kssSelector.id, 'hello');
+ this.testEmptyDoc = function() {
+ // unexpected eof handling
- var txt= "a:dnd-drag(hello)";
+ var txt= "";
var src = new kukit.tk.Cursor(txt);
- var parser = new kukit.kssp.KssSelector(src, null, true);
+ var parser = new kukit.kssp.Document(src, null, true);
this.assertEquals(parser.finished, true);
- this.assertEquals(parser.kssSelector.isEventSelector, true);
- this.assertEquals(parser.kssSelector.css, 'a');
- this.assertEquals(parser.kssSelector.name, 'drag');
- this.assertEquals(parser.kssSelector.namespace, 'dnd');
- this.assertEquals(parser.kssSelector.id, 'hello');
+ this.assertEquals(parser.eventRules.length, 0);
- var txt= "a:dnd-drag-toomuch(hello)";
+ // In particular, this should not raise unexpected eof.
+ var txt= "/*xxx*/";
var src = new kukit.tk.Cursor(txt);
- this.assertParsingError(kukit.kssp.KssSelector, src, null, true,
- 'Wrong event selector [dnd-drag-toomuch] : qualifier should be :<EVENTNAME> or :<NAMESPACE>'
- , 25);
-
- // maybe in std css space is not allowed in the parents,
- // but we tolerate it
- txt= " a div#id:drag( hello)";
- src = new kukit.tk.Cursor(txt);
- parser = new kukit.kssp.KssSelector(src, null, true);
- this.assertEquals(parser.kssSelector.isEventSelector, true);
- this.assertEquals(parser.kssSelector.css, ' a div#id');
- this.assertEquals(parser.kssSelector.name, 'drag');
- this.assertEquals(parser.kssSelector.namespace, null);
- this.assertEquals(parser.kssSelector.id, 'hello');
-
- // We do not allow space here
- txt= " a div#id:drag (hello)";
- src = new kukit.tk.Cursor(txt);
- this.assertParsingError(kukit.kssp.KssSelector, src, null, true,
- 'Wrong event selector : missing event qualifier :<EVENTNAME> or :<EVENTNAME>(<ID>).', 25);
-
- // We do not allow space here
- txt= " a div#id: drag(hello)";
- src = new kukit.tk.Cursor(txt);
- this.assertParsingError(kukit.kssp.KssSelector, src, null, true,
- 'Wrong event selector : missing event qualifier :<EVENTNAME> or :<EVENTNAME>(<ID>).', 23);
-
- txt= "a div#id:drop ";
- src = new kukit.tk.Cursor(txt);
- parser = new kukit.kssp.KssSelector(src, null, true);
- this.assertEquals(parser.kssSelector.isEventSelector, true);
- this.assertEquals(parser.kssSelector.css, 'a div#id');
- this.assertEquals(parser.kssSelector.name, 'drop');
- this.assertEquals(parser.kssSelector.namespace, null);
- this.assertEquals(parser.kssSelector.id, null);
-
- txt= "a div.class:drop ";
- src = new kukit.tk.Cursor(txt);
- parser = new kukit.kssp.KssSelector(src, null, true);
- this.assertEquals(parser.finished, true);
- this.assertEquals(parser.kssSelector.isEventSelector, true);
- this.assertEquals(parser.kssSelector.css, 'a div.class');
- this.assertEquals(parser.kssSelector.name, 'drop');
- this.assertEquals(parser.kssSelector.namespace, null);
- this.assertEquals(parser.kssSelector.id, null);
-
- txt= "a:click ";
- src = new kukit.tk.Cursor(txt);
- parser = new kukit.kssp.KssSelector(src, null, true);
+ var parser = new kukit.kssp.Document(src, null, true);
this.assertEquals(parser.finished, true);
- this.assertEquals(parser.kssSelector.isEventSelector, true);
- this.assertEquals(parser.kssSelector.css, 'a');
- this.assertEquals(parser.kssSelector.name, 'click');
- this.assertEquals(parser.kssSelector.namespace, null);
- this.assertEquals(parser.kssSelector.id, null);
-
- // two params: not allowed
- txt= "a:drop('hello', bello)";
- src = new kukit.tk.Cursor(txt);
- this.assertParsingError(kukit.kssp.KssSelector, src, null, true,
- 'Wrong event selector ::<EVENTNAME>(<ID>) can have only one parameter.', 22);
-
- // zero params: not std css but tolerated
- txt= "a:drop()";
- src = new kukit.tk.Cursor(txt);
- parser = new kukit.kssp.KssSelector(src, null, true);
- this.assertParsingError(kukit.kssp.KssSelector, src, null, true,
- 'Wrong event selector : missing event qualifier :<EVENTNAME> or :<EVENTNAME>(<ID>).', 8);
-
- txt= " (hello)";
- src = new kukit.tk.Cursor(txt);
- this.assertParsingError(kukit.kssp.KssSelector, src, null, true,
- 'Wrong event selector : missing event qualifier :<EVENTNAME> or :<EVENTNAME>(<ID>).', 10);
-
- txt= "hello ('bello')";
- src = new kukit.tk.Cursor(txt);
- this.assertParsingError(kukit.kssp.KssSelector, src, null, true,
- 'Wrong event selector : missing event qualifier :<EVENTNAME> or :<EVENTNAME>(<ID>).', 16);
-
- txt= "a:lang(hu) (hello)";
- src = new kukit.tk.Cursor(txt);
- this.assertParsingError(kukit.kssp.KssSelector, src, null, true,
- 'Wrong event selector : missing event qualifier :<EVENTNAME> or :<EVENTNAME>(<ID>).', 19);
-
- txt= "a:lang(hu) b (hello)";
- src = new kukit.tk.Cursor(txt);
- this.assertParsingError(kukit.kssp.KssSelector, src, null, true,
- 'Wrong event selector : missing event qualifier :<EVENTNAME> or :<EVENTNAME>(<ID>).', 20);
-
- // A valid attr selector in the css selector part.
- txt= "a[href=hello].class:lang(hu) div#id:click ";
- src = new kukit.tk.Cursor(txt);
- parser = new kukit.kssp.KssSelector(src, null, true);
- this.assertEquals(parser.kssSelector.isEventSelector, true);
- this.assertEquals(parser.kssSelector.css, "a[href=hello].class:lang(hu) div#id");
- this.assertEquals(parser.kssSelector.name, 'click');
- this.assertEquals(parser.kssSelector.namespace, null);
- this.assertEquals(parser.kssSelector.id, null);
+ this.assertEquals(parser.eventRules.length, 0);
+ };
- txt= "a[href=hello].class:lang(hu) div#id:drop(hello) ";
- src = new kukit.tk.Cursor(txt);
- parser = new kukit.kssp.KssSelector(src, null, true);
- this.assertEquals(parser.finished, true);
- this.assertEquals(parser.kssSelector.isEventSelector, true);
- this.assertEquals(parser.kssSelector.css, "a[href=hello].class:lang(hu) div#id");
- this.assertEquals(parser.kssSelector.name, 'drop');
- this.assertEquals(parser.kssSelector.namespace, null);
- this.assertEquals(parser.kssSelector.id, 'hello');
+ this.testFull = function() {
+ // Basic parsing test
+ var txt= ""
+ +"/* a long\n"
+ +"** comment\n"
+ +"*/\n"
+ +"\n"
+ +"#calendar-previous a:click {\n"
+ +" action-server : kukitresponse/kukitGetPreviousMonth;\n"
+ +"}\n"
+ +"div#update-area:timeout {\n"
+ +" evt-timeout-delay: 2000; \n"
+ +" action-server: getCurrentTime;\n"
+ +" getCurrentTime-effect: fade; \n"
+ +"}\n"
+ +"#calendar-previous a:click {\n"
+ +" action-server: 'kukitresponse/kukitGetPreviousMonth' /* place comment here*/;\n"
+ +"}\n"
+ +"#calendar-previous a:click {\n"
+ +" action-server : kukitGetPreviousMonth /* place comment here*/;\n"
+ +" kukitGetPreviousMonth-member: formVar(edit, 'f_member');\n"
+ +"}\n"
+ +"#calendar-previous a:dnd-drag(shelve) {\n"
+ +" action-server : whatever\n"
+ +"}\n"
+ +"#button-one:annoyClicker-click(annoy-me) {\n"
+ +" action-server: clickedButton;\n"
+ +" clickedButton-id: nodeAttr(id);\n"
+ +"}\n"
+ +"document:annoy(annoyMe) {\n"
+ +" action-client: alert;\n"
+ +' alert-message: "You are an idiot! Ha ha ha. (But just keep on trying...)";\n'
+ +"}\n"
+ +"document:annoyClicker-annoy(annoyMe) {\n"
+ +" action-client: alert;\n"
+ +' alert-message: "You are an idiot! Ha ha ha. (But just keep on trying...)";\n'
+ +"}\n"
+ +"div#update-area:timeout {\n"
+ +" evt-timeout-delay: 2000; \n"
+ +" action-server: getCurrentTime;\n"
+ +" getCurrentTime-effect: fade; \n"
+ +" action-client: log;\n"
+ +' log-message: "Logging";\n'
+ +"}\n"
+ +"document:annoyClicker-annoy(annoyMe) {\n"
+ +" evt-annoyClicker-annoy-preventdefault: true;\n"
+ +" action-client: namespaced-alert;\n"
+ +' namespaced-alert-message: "You are an idiot! Ha ha ha. (But just keep on trying...)";\n'
+ +'}\n'
+ +'#button_1:click {\n'
+ +'action-client: setStyle;\n'
+ +'setStyle-kssSelector: htmlid(button_2);\n'
+ +'setStyle-name: backgroundColor;\n'
+ +'setStyle-value: #FFa0a0;\n'
+ +'}\n'
+ +'#button_3:click {\n'
+ +'action-client: setStyle;\n'
+ +'setStyle-kssSelector: "#button_4";\n'
+ +'setStyle-name: /* comment blabla */ backgroundColor;\n'
+ +'setStyle-value: #FFa0a0;\n'
+ +"}\n";
- txt= " a:lang(hu) click ";
- src = new kukit.tk.Cursor(txt);
- this.assertParsingError(kukit.kssp.KssSelector, src, null, true,
- 'Wrong event selector : missing event qualifier :<EVENTNAME> or :<EVENTNAME>(<ID>).', 20);
+ var src = new kukit.tk.Cursor(txt);
- // Spaces in the end
- txt= " a:lang(hu, uh) b:click ";
- src = new kukit.tk.Cursor(txt);
- parser = new kukit.kssp.KssSelector(src, null, true);
+ // XXX TODO change comments
+
+ var parser = new kukit.kssp.Document(src, null, true);
this.assertEquals(parser.finished, true);
- this.assertEquals(parser.kssSelector.isEventSelector, true);
- this.assertEquals(parser.kssSelector.css, " a:lang(hu, uh) b");
- this.assertEquals(parser.kssSelector.name, 'click');
- this.assertEquals(parser.kssSelector.namespace, null);
- this.assertEquals(parser.kssSelector.id, null);
+ this.assertEquals(parser.eventRules.length, 12);
+ var rule;
+ var action;
- // Comment in the end
- txt= " a:lang(hu, uh) b:click/*comment here*/";
- src = new kukit.tk.Cursor(txt);
- parser = new kukit.kssp.KssSelector(src, null, true);
- this.assertEquals(parser.finished, true);
- this.assertEquals(parser.kssSelector.isEventSelector, true);
- this.assertEquals(parser.kssSelector.css, " a:lang(hu, uh) b");
- this.assertEquals(parser.kssSelector.name, 'click');
- this.assertEquals(parser.kssSelector.namespace, null);
- this.assertEquals(parser.kssSelector.id, null);
-
- // Should be ok.
- txt= "a:lang(hu)/*comment here*/b:click ";
- src = new kukit.tk.Cursor(txt);
- parser = new kukit.kssp.KssSelector(src, null, true);
- this.assertEquals(parser.kssSelector.isEventSelector, true);
- this.assertEquals(parser.kssSelector.css, "a:lang(hu)/*comment here*/b");
- this.assertEquals(parser.kssSelector.name, 'click');
- this.assertEquals(parser.kssSelector.namespace, null);
- this.assertEquals(parser.kssSelector.id, null);
-
- // Should be ok.
- txt= "a:lang(hu) click/*comment here*/b:clack ";
- src = new kukit.tk.Cursor(txt);
- parser = new kukit.kssp.KssSelector(src, null, true);
- this.assertEquals(parser.finished, true);
- this.assertEquals(parser.kssSelector.isEventSelector, true);
- this.assertEquals(parser.kssSelector.css, "a:lang(hu) click/*comment here*/b");
- this.assertEquals(parser.kssSelector.name, 'clack');
- this.assertEquals(parser.kssSelector.namespace, null);
- this.assertEquals(parser.kssSelector.id, null);
-
- txt= "a:click:clack ";
- src = new kukit.tk.Cursor(txt);
- this.assertParsingError(kukit.kssp.KssSelector, src, null, true,
- 'Wrong event selector : missing event qualifier :<EVENTNAME> or :<EVENTNAME>(<ID>).', 14);
-
- txt= "a:click :clack ";
- src = new kukit.tk.Cursor(txt);
- this.assertParsingError(kukit.kssp.KssSelector, src, null, true,
- 'Wrong event selector : space before the colon. at row', 18);
-
- txt= "a:click/*comment */:clack ";
- src = new kukit.tk.Cursor(txt);
- this.assertParsingError(kukit.kssp.KssSelector, src, null, true,
- 'Wrong event selector : missing event qualifier :<EVENTNAME> or :<EVENTNAME>(<ID>).', 26);
-
- txt= "click/*comment here*/:clack ";
- src = new kukit.tk.Cursor(txt);
- this.assertParsingError(kukit.kssp.KssSelector, src, null, true,
- 'Wrong event selector : missing event qualifier :<EVENTNAME> or :<EVENTNAME>(<ID>).', 28);
-
- txt= "/*comment here*/click:clack ";
- src = new kukit.tk.Cursor(txt);
- parser = new kukit.kssp.KssSelector(src, null, true);
-
- txt= " no-document:click(hello)";
- src = new kukit.tk.Cursor(txt);
- parser = new kukit.kssp.KssSelector(src, null, true);
- this.assertEquals(parser.finished, true);
- this.assertEquals(parser.kssSelector.isEventSelector, true);
- this.assertEquals(parser.kssSelector.css, " no-document");
- this.assertEquals(parser.kssSelector.name, 'click');
- this.assertEquals(parser.kssSelector.namespace, null);
- this.assertEquals(parser.kssSelector.id, "hello");
-
-
- // Event method selectors
-
- txt= " document:click(hello) ";
- src = new kukit.tk.Cursor(txt);
- parser = new kukit.kssp.KssSelector(src, null, true);
- this.assertEquals(parser.finished, true);
- this.assertEquals(parser.kssSelector.isMethodSelector, true);
- this.assertEquals(parser.kssSelector.css, 'document');
- this.assertEquals(parser.kssSelector.name, 'click');
- this.assertEquals(parser.kssSelector.namespace, null);
- this.assertEquals(parser.kssSelector.id, 'hello');
-
- txt= " document:native-click(hello) ";
- src = new kukit.tk.Cursor(txt);
- parser = new kukit.kssp.KssSelector(src, null, true);
- this.assertEquals(parser.finished, true);
- this.assertEquals(parser.kssSelector.isMethodSelector, true);
- this.assertEquals(parser.kssSelector.css, 'document');
- this.assertEquals(parser.kssSelector.name, 'click');
- this.assertEquals(parser.kssSelector.namespace, 'native');
- this.assertEquals(parser.kssSelector.id, 'hello');
-
- txt= "document";
- src = new kukit.tk.Cursor(txt);
- this.assertParsingError(kukit.kssp.KssSelector, src, null, true,
- 'Wrong event selector : missing event qualifier :<EVENTNAME> or :<EVENTNAME>(<ID>).', 8);
-
- txt= "document: ";
- src = new kukit.tk.Cursor(txt);
- this.assertParsingError(kukit.kssp.KssSelector, src, null, true,
- 'Wrong event selector : event name cannot have spaces. at row', 10);
-
- // also, "behaviour:" works
- txt= " behaviour:click(hello) ";
- src = new kukit.tk.Cursor(txt);
- parser = new kukit.kssp.KssSelector(src, null, true);
- this.assertEquals(parser.finished, true);
- this.assertEquals(parser.kssSelector.isMethodSelector, true);
- this.assertEquals(parser.kssSelector.css, 'behaviour');
- this.assertEquals(parser.kssSelector.name, 'click');
- this.assertEquals(parser.kssSelector.namespace, null);
- this.assertEquals(parser.kssSelector.id, 'hello');
-
- }
-
- this.testEmptyDoc = function() {
- // unexpected eof handling
-
- var txt= "";
- var src = new kukit.tk.Cursor(txt);
- var parser = new kukit.kssp.Document(src, null, true);
- this.assertEquals(parser.finished, true);
- this.assertEquals(parser.eventRules.length, 0);
-
- // In particular, this should not raise unexpected eof.
- var txt= "/*xxx*/";
- var src = new kukit.tk.Cursor(txt);
- var parser = new kukit.kssp.Document(src, null, true);
- this.assertEquals(parser.finished, true);
- this.assertEquals(parser.eventRules.length, 0);
- };
-
- this.testFull = function() {
- // Basic parsing test
- var txt= ""
- +"/* a long\n"
- +"** comment\n"
- +"*/\n"
- +"\n"
- +"#calendar-previous a:click {\n"
- +" action-server : kukitresponse/kukitGetPreviousMonth;\n"
- +"}\n"
- +"div#update-area:timeout {\n"
- +" evt-timeout-delay: 2000; \n"
- +" action-server: getCurrentTime;\n"
- +" getCurrentTime-effect: fade; \n"
- +"}\n"
- +"#calendar-previous a:click {\n"
- +" action-server: 'kukitresponse/kukitGetPreviousMonth' /* place comment here*/;\n"
- +"}\n"
- +"#calendar-previous a:click {\n"
- +" action-server : kukitGetPreviousMonth /* place comment here*/;\n"
- +" kukitGetPreviousMonth-member: formVar(edit, 'f_member');\n"
- +"}\n"
- +"#calendar-previous a:dnd-drag(shelve) {\n"
- +" action-server : whatever\n"
- +"}\n"
- +"#button-one:annoyClicker-click(annoy-me) {\n"
- +" action-server: clickedButton;\n"
- +" clickedButton-id: nodeAttr(id);\n"
- +"}\n"
- +"document:annoy(annoyMe) {\n"
- +" action-client: alert;\n"
- +' alert-message: "You are an idiot! Ha ha ha. (But just keep on trying...)";\n'
- +"}\n"
- +"document:annoyClicker-annoy(annoyMe) {\n"
- +" action-client: alert;\n"
- +' alert-message: "You are an idiot! Ha ha ha. (But just keep on trying...)";\n'
- +"}\n"
- +"div#update-area:timeout {\n"
- +" evt-timeout-delay: 2000; \n"
- +" action-server: getCurrentTime;\n"
- +" getCurrentTime-effect: fade; \n"
- +" action-client: log;\n"
- +' log-message: "Logging";\n'
- +"}\n"
- +"document:annoyClicker-annoy(annoyMe) {\n"
- +" evt-annoyClicker-annoy-preventdefault: true;\n"
- +" action-client: namespaced-alert;\n"
- +' namespaced-alert-message: "You are an idiot! Ha ha ha. (But just keep on trying...)";\n'
- +'}\n'
- +'#button_1:click {\n'
- +'action-client: setStyle;\n'
- +'setStyle-kssSelector: htmlid(button_2);\n'
- +'setStyle-name: backgroundColor;\n'
- +'setStyle-value: #FFa0a0;\n'
- +'}\n'
- +'#button_3:click {\n'
- +'action-client: setStyle;\n'
- +'setStyle-kssSelector: "#button_4";\n'
- +'setStyle-name: /* comment blabla */ backgroundColor;\n'
- +'setStyle-value: #FFa0a0;\n'
- +"}\n";
-
- var src = new kukit.tk.Cursor(txt);
-
- // XXX TODO change comments
-
- var parser = new kukit.kssp.Document(src, null, true);
- this.assertEquals(parser.finished, true);
- this.assertEquals(parser.eventRules.length, 12);
- var rule;
- var action;
-
- // rule 0
- // #calendar-previous a:click {
- // kss-action : kukitresponse/kukitGetPreviousMonth;
- // }
- rule = parser.eventRules[0];
- this.assertDictEquals(rule.parms, {});
- this.assertEquals(rule.kssSelector.isEventSelector, true);
- this.assertEquals(rule.kssSelector.css, '#calendar-previous a');
- this.assertEquals(rule.kssSelector.name, 'click');
- this.assertEquals(rule.kssSelector.namespace, null);
- this.assertEquals(rule.kssSelector.id, null);
- action = rule.actions.content['kukitresponse/kukitGetPreviousMonth'];
- this.assertEquals(action.type, 'S');
- this.assertEquals(action.name, 'kukitresponse/kukitGetPreviousMonth');
- this.assertEquals(action.error, null);
- this.assertKssParmEquals(action.parms, {});
+ // rule 0
+ // #calendar-previous a:click {
+ // kss-action : kukitresponse/kukitGetPreviousMonth;
+ // }
+ rule = parser.eventRules[0];
+ this.assertDictEquals(rule.parms, {});
+ this.assertEquals(rule.kssSelector.isEventSelector, true);
+ this.assertEquals(rule.kssSelector.css, '#calendar-previous a');
+ this.assertEquals(rule.kssSelector.name, 'click');
+ this.assertEquals(rule.kssSelector.namespace, null);
+ this.assertEquals(rule.kssSelector.id, null);
+ action = rule.actions.content['kukitresponse/kukitGetPreviousMonth'];
+ this.assertEquals(action.type, 'S');
+ this.assertEquals(action.name, 'kukitresponse/kukitGetPreviousMonth');
+ this.assertEquals(action.error, null);
+ this.assertKssParmEquals(action.parms, {});
// rule 1
// div#update-area:timeout {
@@ -919,9 +663,327 @@
};
};
+
+kukit.KssParserTestCase.prototype = new kukit.KssParserTestCaseBase;
+
+kukit.KssParserSelectorTestCase = function() {
+ this.name = 'kukit.KssParserSelectorTestCase';
+
+ this.setUp = function() {
+ };
+
+ this.testSelectorWithBinderId = function() {
+ // Parsing event selector params
+ var txt= "a:drag(hello)";
+ var src = new kukit.tk.Cursor(txt);
+ var parser = new kukit.kssp.KssSelector(src, null, true);
+ this.assertEquals(parser.finished, true);
+ this.assertEquals(parser.kssSelector.isEventSelector, true);
+ this.assertEquals(parser.kssSelector.css, 'a');
+ this.assertEquals(parser.kssSelector.name, 'drag');
+ this.assertEquals(parser.kssSelector.namespace, null);
+ this.assertEquals(parser.kssSelector.id, 'hello');
+ };
+
+ this.testKssSelector = function() {
+ var txt= "a:dnd-drag(hello)";
+ var src = new kukit.tk.Cursor(txt);
+ var parser = new kukit.kssp.KssSelector(src, null, true);
+ this.assertEquals(parser.finished, true);
+ this.assertEquals(parser.kssSelector.isEventSelector, true);
+ this.assertEquals(parser.kssSelector.css, 'a');
+ this.assertEquals(parser.kssSelector.name, 'drag');
+ this.assertEquals(parser.kssSelector.namespace, 'dnd');
+ this.assertEquals(parser.kssSelector.id, 'hello');
+
+ var txt= "a:dnd-drag-toomuch(hello)";
+ var src = new kukit.tk.Cursor(txt);
+ this.assertParsingError(kukit.kssp.KssSelector, src, null, true,
+ 'Wrong event selector [dnd-drag-toomuch] : qualifier should be :<EVENTNAME> or :<NAMESPACE>'
+ , 25);
+
+ // maybe in std css space is not allowed in the parents,
+ // but we tolerate it
+ txt= " a div#id:drag( hello)";
+ src = new kukit.tk.Cursor(txt);
+ parser = new kukit.kssp.KssSelector(src, null, true);
+ this.assertEquals(parser.kssSelector.isEventSelector, true);
+ this.assertEquals(parser.kssSelector.css, ' a div#id');
+ this.assertEquals(parser.kssSelector.name, 'drag');
+ this.assertEquals(parser.kssSelector.namespace, null);
+ this.assertEquals(parser.kssSelector.id, 'hello');
+
+ // We do not allow space here
+ txt= " a div#id:drag (hello)";
+ src = new kukit.tk.Cursor(txt);
+ this.assertParsingError(kukit.kssp.KssSelector, src, null, true,
+ 'Wrong event selector : missing event qualifier :<EVENTNAME> or :<EVENTNAME>(<ID>).', 25);
+
+ // We do not allow space here
+ txt= " a div#id: drag(hello)";
+ src = new kukit.tk.Cursor(txt);
+ this.assertParsingError(kukit.kssp.KssSelector, src, null, true,
+ 'Wrong event selector : missing event qualifier :<EVENTNAME> or :<EVENTNAME>(<ID>).', 23);
+
+ txt= "a div#id:drop ";
+ src = new kukit.tk.Cursor(txt);
+ parser = new kukit.kssp.KssSelector(src, null, true);
+ this.assertEquals(parser.kssSelector.isEventSelector, true);
+ this.assertEquals(parser.kssSelector.css, 'a div#id');
+ this.assertEquals(parser.kssSelector.name, 'drop');
+ this.assertEquals(parser.kssSelector.namespace, null);
+ this.assertEquals(parser.kssSelector.id, null);
+
+ txt= "a div.class:drop ";
+ src = new kukit.tk.Cursor(txt);
+ parser = new kukit.kssp.KssSelector(src, null, true);
+ this.assertEquals(parser.finished, true);
+ this.assertEquals(parser.kssSelector.isEventSelector, true);
+ this.assertEquals(parser.kssSelector.css, 'a div.class');
+ this.assertEquals(parser.kssSelector.name, 'drop');
+ this.assertEquals(parser.kssSelector.namespace, null);
+ this.assertEquals(parser.kssSelector.id, null);
+
+ txt= "a:click ";
+ src = new kukit.tk.Cursor(txt);
+ parser = new kukit.kssp.KssSelector(src, null, true);
+ this.assertEquals(parser.finished, true);
+ this.assertEquals(parser.kssSelector.isEventSelector, true);
+ this.assertEquals(parser.kssSelector.css, 'a');
+ this.assertEquals(parser.kssSelector.name, 'click');
+ this.assertEquals(parser.kssSelector.namespace, null);
+ this.assertEquals(parser.kssSelector.id, null);
+
+ // two params: not allowed
+ txt= "a:drop('hello', bello)";
+ src = new kukit.tk.Cursor(txt);
+ this.assertParsingError(kukit.kssp.KssSelector, src, null, true,
+ 'Wrong event selector ::<EVENTNAME>(<ID>) can have only one parameter.', 22);
+
+ // zero params: not std css but tolerated
+ txt= "a:drop()";
+ src = new kukit.tk.Cursor(txt);
+ parser = new kukit.kssp.KssSelector(src, null, true);
+ this.assertParsingError(kukit.kssp.KssSelector, src, null, true,
+ 'Wrong event selector : missing event qualifier :<EVENTNAME> or :<EVENTNAME>(<ID>).', 8);
+
+ txt= " (hello)";
+ src = new kukit.tk.Cursor(txt);
+ this.assertParsingError(kukit.kssp.KssSelector, src, null, true,
+ 'Wrong event selector : missing event qualifier :<EVENTNAME> or :<EVENTNAME>(<ID>).', 10);
+
+ txt= "hello ('bello')";
+ src = new kukit.tk.Cursor(txt);
+ this.assertParsingError(kukit.kssp.KssSelector, src, null, true,
+ 'Wrong event selector : missing event qualifier :<EVENTNAME> or :<EVENTNAME>(<ID>).', 16);
+
+ txt= "a:lang(hu) (hello)";
+ src = new kukit.tk.Cursor(txt);
+ this.assertParsingError(kukit.kssp.KssSelector, src, null, true,
+ 'Wrong event selector : missing event qualifier :<EVENTNAME> or :<EVENTNAME>(<ID>).', 19);
+
+ txt= "a:lang(hu) b (hello)";
+ src = new kukit.tk.Cursor(txt);
+ this.assertParsingError(kukit.kssp.KssSelector, src, null, true,
+ 'Wrong event selector : missing event qualifier :<EVENTNAME> or :<EVENTNAME>(<ID>).', 20);
+
+ // A valid attr selector in the css selector part.
+ txt= "a[href=hello].class:lang(hu) div#id:click ";
+ src = new kukit.tk.Cursor(txt);
+ parser = new kukit.kssp.KssSelector(src, null, true);
+ this.assertEquals(parser.kssSelector.isEventSelector, true);
+ this.assertEquals(parser.kssSelector.css, "a[href=hello].class:lang(hu) div#id");
+ this.assertEquals(parser.kssSelector.name, 'click');
+ this.assertEquals(parser.kssSelector.namespace, null);
+ this.assertEquals(parser.kssSelector.id, null);
+
+ txt= "a[href=hello].class:lang(hu) div#id:drop(hello) ";
+ src = new kukit.tk.Cursor(txt);
+ parser = new kukit.kssp.KssSelector(src, null, true);
+ this.assertEquals(parser.finished, true);
+ this.assertEquals(parser.kssSelector.isEventSelector, true);
+ this.assertEquals(parser.kssSelector.css, "a[href=hello].class:lang(hu) div#id");
+ this.assertEquals(parser.kssSelector.name, 'drop');
+ this.assertEquals(parser.kssSelector.namespace, null);
+ this.assertEquals(parser.kssSelector.id, 'hello');
+
+ txt= " a:lang(hu) click ";
+ src = new kukit.tk.Cursor(txt);
+ this.assertParsingError(kukit.kssp.KssSelector, src, null, true,
+ 'Wrong event selector : missing event qualifier :<EVENTNAME> or :<EVENTNAME>(<ID>).', 20);
+
+ // Spaces in the end
+ txt= " a:lang(hu, uh) b:click ";
+ src = new kukit.tk.Cursor(txt);
+ parser = new kukit.kssp.KssSelector(src, null, true);
+ this.assertEquals(parser.finished, true);
+ this.assertEquals(parser.kssSelector.isEventSelector, true);
+ this.assertEquals(parser.kssSelector.css, " a:lang(hu, uh) b");
+ this.assertEquals(parser.kssSelector.name, 'click');
+ this.assertEquals(parser.kssSelector.namespace, null);
+ this.assertEquals(parser.kssSelector.id, null);
+
+ // Comment in the end
+ txt= " a:lang(hu, uh) b:click/*comment here*/";
+ src = new kukit.tk.Cursor(txt);
+ parser = new kukit.kssp.KssSelector(src, null, true);
+ this.assertEquals(parser.finished, true);
+ this.assertEquals(parser.kssSelector.isEventSelector, true);
+ this.assertEquals(parser.kssSelector.css, " a:lang(hu, uh) b");
+ this.assertEquals(parser.kssSelector.name, 'click');
+ this.assertEquals(parser.kssSelector.namespace, null);
+ this.assertEquals(parser.kssSelector.id, null);
+
+ // Should be ok.
+ txt= "a:lang(hu)/*comment here*/b:click ";
+ src = new kukit.tk.Cursor(txt);
+ parser = new kukit.kssp.KssSelector(src, null, true);
+ this.assertEquals(parser.kssSelector.isEventSelector, true);
+ this.assertEquals(parser.kssSelector.css, "a:lang(hu)/*comment here*/b");
+ this.assertEquals(parser.kssSelector.name, 'click');
+ this.assertEquals(parser.kssSelector.namespace, null);
+ this.assertEquals(parser.kssSelector.id, null);
+
+ // Should be ok.
+ txt= "a:lang(hu) click/*comment here*/b:clack ";
+ src = new kukit.tk.Cursor(txt);
+ parser = new kukit.kssp.KssSelector(src, null, true);
+ this.assertEquals(parser.finished, true);
+ this.assertEquals(parser.kssSelector.isEventSelector, true);
+ this.assertEquals(parser.kssSelector.css, "a:lang(hu) click/*comment here*/b");
+ this.assertEquals(parser.kssSelector.name, 'clack');
+ this.assertEquals(parser.kssSelector.namespace, null);
+ this.assertEquals(parser.kssSelector.id, null);
+
+ txt= "a:click:clack ";
+ src = new kukit.tk.Cursor(txt);
+ this.assertParsingError(kukit.kssp.KssSelector, src, null, true,
+ 'Wrong event selector : missing event qualifier :<EVENTNAME> or :<EVENTNAME>(<ID>).', 14);
+
+ txt= "a:click :clack ";
+ src = new kukit.tk.Cursor(txt);
+ this.assertParsingError(kukit.kssp.KssSelector, src, null, true,
+ 'Wrong event selector : space before the colon. at row', 18);
+
+ txt= "a:click/*comment */:clack ";
+ src = new kukit.tk.Cursor(txt);
+ this.assertParsingError(kukit.kssp.KssSelector, src, null, true,
+ 'Wrong event selector : missing event qualifier :<EVENTNAME> or :<EVENTNAME>(<ID>).', 26);
+
+ txt= "click/*comment here*/:clack ";
+ src = new kukit.tk.Cursor(txt);
+ this.assertParsingError(kukit.kssp.KssSelector, src, null, true,
+ 'Wrong event selector : missing event qualifier :<EVENTNAME> or :<EVENTNAME>(<ID>).', 28);
+
+ txt= "/*comment here*/click:clack ";
+ src = new kukit.tk.Cursor(txt);
+ parser = new kukit.kssp.KssSelector(src, null, true);
+
+ txt= " no-document:click(hello)";
+ src = new kukit.tk.Cursor(txt);
+ parser = new kukit.kssp.KssSelector(src, null, true);
+ this.assertEquals(parser.finished, true);
+ this.assertEquals(parser.kssSelector.isEventSelector, true);
+ this.assertEquals(parser.kssSelector.css, " no-document");
+ this.assertEquals(parser.kssSelector.name, 'click');
+ this.assertEquals(parser.kssSelector.namespace, null);
+ this.assertEquals(parser.kssSelector.id, "hello");
+
+
+ // Event method selectors
+
+ txt= " document:click(hello) ";
+ src = new kukit.tk.Cursor(txt);
+ parser = new kukit.kssp.KssSelector(src, null, true);
+ this.assertEquals(parser.finished, true);
+ this.assertEquals(parser.kssSelector.isMethodSelector, true);
+ this.assertEquals(parser.kssSelector.css, 'document');
+ this.assertEquals(parser.kssSelector.name, 'click');
+ this.assertEquals(parser.kssSelector.namespace, null);
+ this.assertEquals(parser.kssSelector.id, 'hello');
+
+ txt= " document:native-click(hello) ";
+ src = new kukit.tk.Cursor(txt);
+ parser = new kukit.kssp.KssSelector(src, null, true);
+ this.assertEquals(parser.finished, true);
+ this.assertEquals(parser.kssSelector.isMethodSelector, true);
+ this.assertEquals(parser.kssSelector.css, 'document');
+ this.assertEquals(parser.kssSelector.name, 'click');
+ this.assertEquals(parser.kssSelector.namespace, 'native');
+ this.assertEquals(parser.kssSelector.id, 'hello');
+
+ txt= "document";
+ src = new kukit.tk.Cursor(txt);
+ this.assertParsingError(kukit.kssp.KssSelector, src, null, true,
+ 'Wrong event selector : missing event qualifier :<EVENTNAME> or :<EVENTNAME>(<ID>).', 8);
+
+ txt= "document: ";
+ src = new kukit.tk.Cursor(txt);
+ this.assertParsingError(kukit.kssp.KssSelector, src, null, true,
+ 'Wrong event selector : event name cannot have spaces. at row', 10);
+
+ // also, "behaviour:" works
+ txt= " behaviour:click(hello) ";
+ src = new kukit.tk.Cursor(txt);
+ parser = new kukit.kssp.KssSelector(src, null, true);
+ this.assertEquals(parser.finished, true);
+ this.assertEquals(parser.kssSelector.isMethodSelector, true);
+ this.assertEquals(parser.kssSelector.css, 'behaviour');
+ this.assertEquals(parser.kssSelector.name, 'click');
+ this.assertEquals(parser.kssSelector.namespace, null);
+ this.assertEquals(parser.kssSelector.id, 'hello');
+
+ }
+};
+
+kukit.KssParserSelectorTestCase.prototype = new kukit.KssParserTestCaseBase;
+
+kukit.KssParserSelectorsTestCase = function() {
+ this.name = 'kukit.KssParserSelectorsTestCase';
+
+ this.setUp = function() {
+ };
-kukit.KssParserTestCase.prototype = new kukit.TokenizerTestCaseBase;
+ this.testSingleSelector = function() {
+ var txt= "a:drag(hello)";
+ var src = new kukit.tk.Cursor(txt);
+ var parser = new kukit.kssp.KssSelectors(src, null, true);
+ this.assertEquals(parser.finished, true);
+ this.assertEquals(parser.selectors.length, 1);
+ var kssSelector = parser.selectors[0];
+ this.assertEquals(kssSelector.isEventSelector, true);
+ this.assertEquals(kssSelector.css, 'a');
+ this.assertEquals(kssSelector.name, 'drag');
+ this.assertEquals(kssSelector.namespace, null);
+ this.assertEquals(kssSelector.id, 'hello');
+ };
+
+ this.testMultipleSelectors = function() {
+ var txt= "a:drag(hello), div a:click";
+ var src = new kukit.tk.Cursor(txt);
+ var parser = new kukit.kssp.KssSelectors(src, null, true);
+ this.assertEquals(parser.finished, true);
+ this.assertEquals(parser.selectors.length, 2);
+ var kssSelector = parser.selectors[0];
+ this.assertEquals(kssSelector.isEventSelector, true);
+ this.assertEquals(kssSelector.css, 'a');
+ this.assertEquals(kssSelector.name, 'drag');
+ this.assertEquals(kssSelector.namespace, null);
+ this.assertEquals(kssSelector.id, 'hello');
+ var kssSelector = parser.selectors[1];
+ this.assertEquals(kssSelector.isEventSelector, true);
+ this.assertEquals(kssSelector.css, 'div a');
+ this.assertEquals(kssSelector.name, 'click');
+ this.assertEquals(kssSelector.namespace, null);
+ this.assertEquals(kssSelector.id, null);
+ };
+};
+
+kukit.KssParserSelectorsTestCase.prototype = new kukit.KssParserTestCaseBase;
+
if (typeof(testcase_registry) != 'undefined') {
testcase_registry.registerTestCase(kukit.KssParserTestCase, 'kukit.KssParserTestCase');
+ testcase_registry.registerTestCase(kukit.KssParserSelectorTestCase, 'kukit.KssParserSelectorTestCase');
+ testcase_registry.registerTestCase(kukit.KssParserSelectorsTestCase, 'kukit.KssParserSelectorsTestCase');
}
More information about the Kukit-checkins
mailing list