[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