Grammalecte  Hex Artifact Content

Artifact 147f1c4e7bf22794359b9dd033e636e32bb00b76b7615a4a7886515139f1dfac:

  • File gc_core/js/tests.js — part of check-in [977fd9b488] at 2018-10-11 15:39:24 on branch nodejs — [js] Revert syntax change (oubli) (user: IllusionPerdu size: 5976) [more...]

0000: 2f 2f 20 4a 61 76 61 53 63 72 69 70 74 0a 0a 2f  // JavaScript../
0010: 2a 20 6a 73 68 69 6e 74 20 65 73 76 65 72 73 69  * jshint esversi
0020: 6f 6e 3a 36 2c 20 2d 57 30 39 37 20 2a 2f 0a 2f  on:6, -W097 */./
0030: 2a 20 6a 73 6c 69 6e 74 20 65 73 76 65 72 73 69  * jslint esversi
0040: 6f 6e 3a 36 20 2a 2f 0a 2f 2a 20 67 6c 6f 62 61  on:6 */./* globa
0050: 6c 20 72 65 71 75 69 72 65 2c 20 65 78 70 6f 72  l require, expor
0060: 74 73 2c 20 63 6f 6e 73 6f 6c 65 20 2a 2f 0a 0a  ts, console */..
0070: 22 75 73 65 20 73 74 72 69 63 74 22 3b 0a 0a 0a  "use strict";...
0080: 69 66 28 74 79 70 65 6f 66 28 70 72 6f 63 65 73  if(typeof(proces
0090: 73 29 20 21 3d 3d 20 27 75 6e 64 65 66 69 6e 65  s) !== 'undefine
00a0: 64 27 29 20 7b 0a 20 20 20 20 76 61 72 20 68 65  d') {.    var he
00b0: 6c 70 65 72 73 20 3d 20 72 65 71 75 69 72 65 28  lpers = require(
00c0: 22 2e 2f 67 72 61 70 68 73 70 65 6c 6c 2f 68 65  "./graphspell/he
00d0: 6c 70 65 72 73 2e 6a 73 22 29 3b 0a 7d 20 65 6c  lpers.js");.} el
00e0: 73 65 20 69 66 20 28 74 79 70 65 6f 66 28 72 65  se if (typeof(re
00f0: 71 75 69 72 65 29 20 21 3d 3d 20 27 75 6e 64 65  quire) !== 'unde
0100: 66 69 6e 65 64 27 29 20 7b 0a 20 20 20 20 76 61  fined') {.    va
0110: 72 20 68 65 6c 70 65 72 73 20 3d 20 72 65 71 75  r helpers = requ
0120: 69 72 65 28 22 72 65 73 6f 75 72 63 65 3a 2f 2f  ire("resource://
0130: 67 72 61 6d 6d 61 6c 65 63 74 65 2f 67 72 61 70  grammalecte/grap
0140: 68 73 70 65 6c 6c 2f 68 65 6c 70 65 72 73 2e 6a  hspell/helpers.j
0150: 73 22 29 3b 0a 7d 0a 0a 0a 63 6c 61 73 73 20 54  s");.}...class T
0160: 65 73 74 47 72 61 6d 6d 61 72 43 68 65 63 6b 69  estGrammarChecki
0170: 6e 67 20 7b 0a 0a 20 20 20 20 63 6f 6e 73 74 72  ng {..    constr
0180: 75 63 74 6f 72 20 28 67 63 65 2c 20 73 70 66 54  uctor (gce, spfT
0190: 65 73 74 73 3d 22 22 29 20 7b 0a 20 20 20 20 20  ests="") {.     
01a0: 20 20 20 74 68 69 73 2e 67 63 65 20 3d 20 67 63     this.gce = gc
01b0: 65 3b 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e  e;.        this.
01c0: 73 70 66 54 65 73 74 73 20 3d 20 73 70 66 54 65  spfTests = spfTe
01d0: 73 74 73 3b 0a 20 20 20 20 20 20 20 20 74 68 69  sts;.        thi
01e0: 73 2e 5f 61 52 75 6c 65 54 65 73 74 65 64 20 3d  s._aRuleTested =
01f0: 20 6e 65 77 20 53 65 74 28 29 3b 0a 20 20 20 20   new Set();.    
0200: 7d 0a 0a 20 20 20 20 2a 20 74 65 73 74 50 61 72  }..    * testPar
0210: 73 65 20 28 62 44 65 62 75 67 3d 66 61 6c 73 65  se (bDebug=false
0220: 29 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  ) {.        cons
0230: 74 20 74 30 20 3d 20 44 61 74 65 2e 6e 6f 77 28  t t0 = Date.now(
0240: 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 73  );.        let s
0250: 55 52 4c 3b 0a 20 20 20 20 20 20 20 20 69 66 28  URL;.        if(
0260: 74 79 70 65 6f 66 28 70 72 6f 63 65 73 73 29 20  typeof(process) 
0270: 21 3d 3d 20 27 75 6e 64 65 66 69 6e 65 64 27 29  !== 'undefined')
0280: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   {.            s
0290: 55 52 4c 20 3d 20 28 74 68 69 73 2e 73 70 66 54  URL = (this.spfT
02a0: 65 73 74 73 20 21 3d 3d 20 22 22 29 20 3f 20 74  ests !== "") ? t
02b0: 68 69 73 2e 73 70 66 54 65 73 74 73 20 3a 20 22  his.spfTests : "
02c0: 2e 2f 22 2b 74 68 69 73 2e 67 63 65 2e 6c 61 6e  ./"+this.gce.lan
02d0: 67 2b 22 2f 74 65 73 74 73 5f 64 61 74 61 2e 6a  g+"/tests_data.j
02e0: 73 6f 6e 22 3b 0a 20 20 20 20 20 20 20 20 7d 20  son";.        } 
02f0: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
0300: 20 20 20 73 55 52 4c 20 3d 20 28 74 68 69 73 2e     sURL = (this.
0310: 73 70 66 54 65 73 74 73 20 21 3d 3d 20 22 22 29  spfTests !== "")
0320: 20 3f 20 74 68 69 73 2e 73 70 66 54 65 73 74 73   ? this.spfTests
0330: 20 3a 20 22 72 65 73 6f 75 72 63 65 3a 2f 2f 67   : "resource://g
0340: 72 61 6d 6d 61 6c 65 63 74 65 2f 22 2b 74 68 69  rammalecte/"+thi
0350: 73 2e 67 63 65 2e 6c 61 6e 67 2b 22 2f 74 65 73  s.gce.lang+"/tes
0360: 74 73 5f 64 61 74 61 2e 6a 73 6f 6e 22 3b 0a 20  ts_data.json";. 
0370: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
0380: 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 4a   const aData = J
0390: 53 4f 4e 2e 70 61 72 73 65 28 68 65 6c 70 65 72  SON.parse(helper
03a0: 73 2e 6c 6f 61 64 46 69 6c 65 28 73 55 52 4c 29  s.loadFile(sURL)
03b0: 29 2e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20  ).aData;.       
03c0: 20 6c 65 74 20 6e 49 6e 76 61 6c 69 64 20 3d 20   let nInvalid = 
03d0: 30 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6e  0;.        let n
03e0: 54 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  Total = 0;.     
03f0: 20 20 20 6c 65 74 20 73 45 72 72 6f 72 54 65 78     let sErrorTex
0400: 74 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 73  t;.        let s
0410: 53 75 67 67 3b 0a 20 20 20 20 20 20 20 20 6c 65  Sugg;.        le
0420: 74 20 73 45 78 70 65 63 74 65 64 45 72 72 6f 72  t sExpectedError
0430: 73 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 73  s;.        let s
0440: 54 65 78 74 54 6f 43 68 65 63 6b 3b 0a 20 20 20  TextToCheck;.   
0450: 20 20 20 20 20 6c 65 74 20 73 46 6f 75 6e 64 45       let sFoundE
0460: 72 72 6f 72 73 3b 0a 20 20 20 20 20 20 20 20 6c  rrors;.        l
0470: 65 74 20 73 4c 69 73 74 45 72 72 3b 0a 20 20 20  et sListErr;.   
0480: 20 20 20 20 20 6c 65 74 20 73 4c 69 6e 65 4e 75       let sLineNu
0490: 6d 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 69  m;.        let i
04a0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6c 65   = 1;.        le
04b0: 74 20 73 55 6e 74 65 73 74 65 64 52 75 6c 65 73  t sUntestedRules
04c0: 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20 6c   = "";.        l
04d0: 65 74 20 62 53 68 6f 77 55 6e 74 65 73 74 65 64  et bShowUntested
04e0: 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20 20 20   = false;.      
04f0: 20 20 6c 65 74 20 7a 4f 70 74 69 6f 6e 20 3d 20    let zOption = 
0500: 2f 5e 5f 5f 28 5b 61 2d 7a 41 2d 5a 30 2d 39 5d  /^__([a-zA-Z0-9]
0510: 2b 29 5f 5f 20 2f 3b 0a 20 20 20 20 20 20 20 20  +)__ /;.        
0520: 6c 65 74 20 73 4f 70 74 69 6f 6e 3b 0a 20 20 20  let sOption;.   
0530: 20 20 20 20 20 6c 65 74 20 6d 3b 0a 20 20 20 20       let m;.    
0540: 20 20 20 20 79 69 65 6c 64 20 22 54 65 73 74 73      yield "Tests
0550: 20 5b 22 20 2b 20 74 68 69 73 2e 67 63 65 2e 6c   [" + this.gce.l
0560: 61 6e 67 20 2b 20 22 5d 3a 20 22 20 2b 20 61 44  ang + "]: " + aD
0570: 61 74 61 2e 6c 65 6e 67 74 68 2e 74 6f 53 74 72  ata.length.toStr
0580: 69 6e 67 28 29 3b 0a 20 20 20 20 20 20 20 20 74  ing();.        t
0590: 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ry {.           
05a0: 20 66 6f 72 20 28 6c 65 74 20 73 4c 69 6e 65 20   for (let sLine 
05b0: 6f 66 20 61 44 61 74 61 29 20 7b 0a 20 20 20 20  of aData) {.    
05c0: 20 20 20 20 20 20 20 20 20 20 20 20 73 4c 69 6e              sLin
05d0: 65 4e 75 6d 20 3d 20 73 4c 69 6e 65 2e 73 6c 69  eNum = sLine.sli
05e0: 63 65 28 30 2c 31 30 29 2e 74 72 69 6d 28 29 3b  ce(0,10).trim();
05f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0600: 20 73 4c 69 6e 65 20 3d 20 73 4c 69 6e 65 2e 73   sLine = sLine.s
0610: 6c 69 63 65 28 31 30 29 2e 74 72 69 6d 28 29 3b  lice(10).trim();
0620: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0630: 20 69 66 20 28 73 4c 69 6e 65 2e 6c 65 6e 67 74   if (sLine.lengt
0640: 68 20 3e 20 30 20 26 26 20 21 73 4c 69 6e 65 2e  h > 0 && !sLine.
0650: 73 74 61 72 74 73 57 69 74 68 28 22 23 22 29 29  startsWith("#"))
0660: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
0670: 20 20 20 20 20 20 20 73 4f 70 74 69 6f 6e 20 3d         sOption =
0680: 20 66 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20   false;.        
0690: 20 20 20 20 20 20 20 20 20 20 20 20 6d 20 3d 20              m = 
06a0: 7a 4f 70 74 69 6f 6e 2e 65 78 65 63 28 73 4c 69  zOption.exec(sLi
06b0: 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ne);.           
06c0: 20 20 20 20 20 20 20 20 20 69 66 20 28 6d 29 20           if (m) 
06d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
06e0: 20 20 20 20 20 20 20 20 20 20 73 4c 69 6e 65 20            sLine 
06f0: 3d 20 73 4c 69 6e 65 2e 73 6c 69 63 65 28 73 4c  = sLine.slice(sL
0700: 69 6e 65 2e 69 6e 64 65 78 4f 66 28 22 20 22 29  ine.indexOf(" ")
0710: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +1);.           
0720: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 4f 70               sOp
0730: 74 69 6f 6e 20 3d 20 6d 5b 31 5d 3b 0a 20 20 20  tion = m[1];.   
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0750: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
0760: 20 20 20 20 20 20 20 69 66 20 28 73 4c 69 6e 65         if (sLine
0770: 2e 69 6e 63 6c 75 64 65 73 28 22 2d 3e 3e 22 29  .includes("->>")
0780: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
0790: 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 45 72              [sEr
07a0: 72 6f 72 54 65 78 74 2c 20 73 53 75 67 67 5d 20  rorText, sSugg] 
07b0: 3d 20 73 4c 69 6e 65 2e 73 70 6c 69 74 28 22 2d  = sLine.split("-
07c0: 3e 3e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >>");.          
07d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 45                sE
07e0: 72 72 6f 72 54 65 78 74 20 3d 20 73 45 72 72 6f  rrorText = sErro
07f0: 72 54 65 78 74 2e 74 72 69 6d 28 29 3b 0a 20 20  rText.trim();.  
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 20 20 20 73 53 75 67 67 20 3d 20 73 53        sSugg = sS
0820: 75 67 67 2e 74 72 69 6d 28 29 3b 0a 20 20 20 20  ugg.trim();.    
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0840: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
0850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0860: 20 73 45 72 72 6f 72 54 65 78 74 20 3d 20 73 4c   sErrorText = sL
0870: 69 6e 65 2e 74 72 69 6d 28 29 3b 0a 20 20 20 20  ine.trim();.    
0880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0890: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
08a0: 20 20 20 20 20 20 73 45 78 70 65 63 74 65 64 45        sExpectedE
08b0: 72 72 6f 72 73 20 3d 20 74 68 69 73 2e 5f 67 65  rrors = this._ge
08c0: 74 45 78 70 65 63 74 65 64 45 72 72 6f 72 73 28  tExpectedErrors(
08d0: 73 45 72 72 6f 72 54 65 78 74 29 3b 0a 20 20 20  sErrorText);.   
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08f0: 20 73 54 65 78 74 54 6f 43 68 65 63 6b 20 3d 20   sTextToCheck = 
0900: 73 45 72 72 6f 72 54 65 78 74 2e 72 65 70 6c 61  sErrorText.repla
0910: 63 65 28 2f 5c 7b 5c 7b 2f 67 2c 20 22 22 29 2e  ce(/\{\{/g, "").
0920: 72 65 70 6c 61 63 65 28 2f 5c 7d 5c 7d 2f 67 2c  replace(/\}\}/g,
0930: 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20   "");.          
0940: 20 20 20 20 20 20 20 20 20 20 5b 73 46 6f 75 6e            [sFoun
0950: 64 45 72 72 6f 72 73 2c 20 73 4c 69 73 74 45 72  dErrors, sListEr
0960: 72 5d 20 3d 20 74 68 69 73 2e 5f 67 65 74 46 6f  r] = this._getFo
0970: 75 6e 64 45 72 72 6f 72 73 28 73 54 65 78 74 54  undErrors(sTextT
0980: 6f 43 68 65 63 6b 2c 20 62 44 65 62 75 67 2c 20  oCheck, bDebug, 
0990: 73 4f 70 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20  sOption);.      
09a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
09b0: 20 28 73 45 78 70 65 63 74 65 64 45 72 72 6f 72   (sExpectedError
09c0: 73 20 21 3d 3d 20 73 46 6f 75 6e 64 45 72 72 6f  s !== sFoundErro
09d0: 72 73 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  rs) {.          
09e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 79 69                yi
09f0: 65 6c 64 20 22 5c 6e 22 20 2b 20 69 2e 74 6f 53  eld "\n" + i.toS
0a00: 74 72 69 6e 67 28 29 20 2b 0a 20 20 20 20 20 20  tring() +.      
0a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a20: 20 20 20 20 20 20 20 20 22 5c 6e 23 20 4c 69 6e          "\n# Lin
0a30: 65 20 6e 75 6d 3a 20 22 20 2b 20 73 4c 69 6e 65  e num: " + sLine
0a40: 4e 75 6d 20 2b 0a 20 20 20 20 20 20 20 20 20 20  Num +.          
0a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a60: 20 20 20 20 22 5c 6e 3e 20 74 6f 20 63 68 65 63      "\n> to chec
0a70: 6b 3a 20 22 20 2b 20 73 54 65 78 74 54 6f 43 68  k: " + sTextToCh
0a80: 65 63 6b 20 2b 0a 20 20 20 20 20 20 20 20 20 20  eck +.          
0a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0aa0: 20 20 20 20 22 5c 6e 20 20 65 78 70 65 63 74 65      "\n  expecte
0ab0: 64 3a 20 22 20 2b 20 73 45 78 70 65 63 74 65 64  d: " + sExpected
0ac0: 45 72 72 6f 72 73 20 2b 0a 20 20 20 20 20 20 20  Errors +.       
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ae0: 20 20 20 20 20 20 20 22 5c 6e 20 20 66 6f 75 6e         "\n  foun
0af0: 64 3a 20 20 20 20 22 20 2b 20 73 46 6f 75 6e 64  d:    " + sFound
0b00: 45 72 72 6f 72 73 20 2b 0a 20 20 20 20 20 20 20  Errors +.       
0b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b20: 20 20 20 20 20 20 20 22 5c 6e 20 20 65 72 72 6f         "\n  erro
0b30: 72 73 3a 20 20 20 5c 6e 22 20 2b 20 73 4c 69 73  rs:   \n" + sLis
0b40: 74 45 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20  tErr;.          
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 49                nI
0b60: 6e 76 61 6c 69 64 20 3d 20 6e 49 6e 76 61 6c 69  nvalid = nInvali
0b70: 64 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 20  d + 1;.         
0b80: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ba0: 20 6e 54 6f 74 61 6c 20 3d 20 6e 54 6f 74 61 6c   nTotal = nTotal
0bb0: 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   + 1;.          
0bc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
0bd0: 20 20 20 20 20 20 20 20 69 20 3d 20 69 20 2b 20          i = i + 
0be0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
0bf0: 20 20 20 69 66 20 28 69 20 25 20 31 30 30 30 20     if (i % 1000 
0c00: 3d 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 20  === 0) {.       
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 79 69 65               yie
0c20: 6c 64 20 69 2e 74 6f 53 74 72 69 6e 67 28 29 3b  ld i.toString();
0c30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0c40: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
0c50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 53 68  .            bSh
0c60: 6f 77 55 6e 74 65 73 74 65 64 20 3d 20 74 72 75  owUntested = tru
0c70: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
0c80: 20 20 20 20 20 63 61 74 63 68 20 28 65 29 20 7b       catch (e) {
0c90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
0ca0: 73 6f 6c 65 2e 65 72 72 6f 72 28 65 29 3b 0a 20  sole.error(e);. 
0cb0: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
0cc0: 20 20 69 66 20 28 62 53 68 6f 77 55 6e 74 65 73    if (bShowUntes
0cd0: 74 65 64 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ted) {.         
0ce0: 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 20 20     i = 0;.      
0cf0: 20 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 5b        for (let [
0d00: 73 4f 70 74 2c 20 73 4c 69 6e 65 49 64 2c 20 73  sOpt, sLineId, s
0d10: 52 75 6c 65 49 64 5d 20 6f 66 20 74 68 69 73 2e  RuleId] of this.
0d20: 67 63 65 2e 6c 69 73 74 52 75 6c 65 73 28 29 29  gce.listRules())
0d30: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
0d40: 20 20 20 69 66 20 28 73 4f 70 74 20 21 3d 3d 20     if (sOpt !== 
0d50: 22 40 40 40 40 22 20 26 26 20 21 74 68 69 73 2e  "@@@@" && !this.
0d60: 5f 61 52 75 6c 65 54 65 73 74 65 64 2e 68 61 73  _aRuleTested.has
0d70: 28 73 4c 69 6e 65 49 64 29 20 26 26 20 21 2f 5e  (sLineId) && !/^
0d80: 5b 30 2d 39 5d 2b 5b 73 70 5d 24 7c 5e 5b 70 64  [0-9]+[sp]$|^[pd
0d90: 5d 5f 2f 2e 74 65 73 74 28 73 52 75 6c 65 49 64  ]_/.test(sRuleId
0da0: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
0db0: 20 20 20 20 20 20 20 20 20 73 55 6e 74 65 73 74           sUntest
0dc0: 65 64 52 75 6c 65 73 20 2b 3d 20 73 4c 69 6e 65  edRules += sLine
0dd0: 49 64 20 2b 20 22 2f 22 20 2b 20 73 52 75 6c 65  Id + "/" + sRule
0de0: 49 64 20 2b 20 22 2c 20 22 3b 0a 20 20 20 20 20  Id + ", ";.     
0df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
0e00: 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20   += 1;.         
0e10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
0e20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
0e30: 20 20 20 69 66 20 28 69 20 3e 20 30 29 20 7b 0a     if (i > 0) {.
0e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e50: 79 69 65 6c 64 20 73 55 6e 74 65 73 74 65 64 52  yield sUntestedR
0e60: 75 6c 65 73 20 2b 20 22 5c 6e 5b 22 20 2b 20 69  ules + "\n[" + i
0e70: 2e 74 6f 53 74 72 69 6e 67 28 29 20 2b 20 22 20  .toString() + " 
0e80: 75 6e 74 65 73 74 65 64 20 72 75 6c 65 73 5d 22  untested rules]"
0e90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
0ea0: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
0eb0: 20 20 20 63 6f 6e 73 74 20 74 31 20 3d 20 44 61     const t1 = Da
0ec0: 74 65 2e 6e 6f 77 28 29 3b 0a 20 20 20 20 20 20  te.now();.      
0ed0: 20 20 79 69 65 6c 64 20 22 54 65 73 74 73 20 70    yield "Tests p
0ee0: 61 72 73 65 20 66 69 6e 69 73 68 65 64 20 69 6e  arse finished in
0ef0: 20 22 20 2b 20 28 28 74 31 2d 74 30 29 2f 31 30   " + ((t1-t0)/10
0f00: 30 30 29 2e 74 6f 53 74 72 69 6e 67 28 29 0a 20  00).toString(). 
0f10: 20 20 20 20 20 20 20 20 20 20 20 2b 20 22 20 73             + " s
0f20: 5c 6e 54 6f 74 61 6c 20 65 72 72 6f 72 73 3a 20  \nTotal errors: 
0f30: 22 20 2b 20 6e 49 6e 76 61 6c 69 64 2e 74 6f 53  " + nInvalid.toS
0f40: 74 72 69 6e 67 28 29 20 2b 20 22 20 2f 20 22 20  tring() + " / " 
0f50: 2b 20 6e 54 6f 74 61 6c 2e 74 6f 53 74 72 69 6e  + nTotal.toStrin
0f60: 67 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  g();.    }..    
0f70: 5f 67 65 74 45 78 70 65 63 74 65 64 45 72 72 6f  _getExpectedErro
0f80: 72 73 20 28 73 4c 69 6e 65 29 20 7b 0a 20 20 20  rs (sLine) {.   
0f90: 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20       try {.     
0fa0: 20 20 20 20 20 20 20 6c 65 74 20 73 52 65 73 20         let sRes 
0fb0: 3d 20 22 20 22 2e 72 65 70 65 61 74 28 73 4c 69  = " ".repeat(sLi
0fc0: 6e 65 2e 6c 65 6e 67 74 68 29 3b 0a 20 20 20 20  ne.length);.    
0fd0: 20 20 20 20 20 20 20 20 6c 65 74 20 7a 20 3d 20          let z = 
0fe0: 2f 5c 7b 5c 7b 2e 2b 3f 5c 7d 5c 7d 2f 67 3b 0a  /\{\{.+?\}\}/g;.
0ff0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20              let 
1000: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  m;.            l
1010: 65 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 20 20  et i = 0;.      
1020: 20 20 20 20 20 20 77 68 69 6c 65 20 28 28 6d 20        while ((m 
1030: 3d 20 7a 2e 65 78 65 63 28 73 4c 69 6e 65 29 29  = z.exec(sLine))
1040: 20 21 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20   !== null) {.   
1050: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74               let
1060: 20 6e 53 74 61 72 74 20 3d 20 6d 2e 69 6e 64 65   nStart = m.inde
1070: 78 20 2d 20 28 34 20 2a 20 69 29 3b 0a 20 20 20  x - (4 * i);.   
1080: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74               let
1090: 20 6e 45 6e 64 20 3d 20 6d 2e 69 6e 64 65 78 20   nEnd = m.index 
10a0: 2b 20 6d 5b 30 5d 2e 6c 65 6e 67 74 68 20 2d 20  + m[0].length - 
10b0: 28 34 20 2a 20 28 69 2b 31 29 29 3b 0a 20 20 20  (4 * (i+1));.   
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 52 65               sRe
10d0: 73 20 3d 20 73 52 65 73 2e 73 6c 69 63 65 28 30  s = sRes.slice(0
10e0: 2c 20 6e 53 74 61 72 74 29 20 2b 20 22 7e 22 2e  , nStart) + "~".
10f0: 72 65 70 65 61 74 28 6e 45 6e 64 20 2d 20 6e 53  repeat(nEnd - nS
1100: 74 61 72 74 29 20 2b 20 73 52 65 73 2e 73 6c 69  tart) + sRes.sli
1110: 63 65 28 6e 45 6e 64 2c 20 2d 34 29 3b 0a 20 20  ce(nEnd, -4);.  
1120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 20                i 
1130: 3d 20 69 20 2b 20 31 3b 0a 20 20 20 20 20 20 20  = i + 1;.       
1140: 20 20 20 20 20 20 20 20 20 2f 2f 20 57 61 72 6e           // Warn
1150: 69 6e 67 21 20 4a 53 20 73 75 63 6b 73 3a 20 69  ing! JS sucks: i
1160: 6e 66 69 6e 69 74 65 20 6c 6f 6f 70 20 69 66 20  nfinite loop if 
1170: 77 72 69 74 69 6e 67 20 64 69 72 65 63 74 6c 79  writing directly
1180: 20 2f 5c 7b 5c 7b 2e 2b 3f 5c 7d 5c 7d 2f 67 2e   /\{\{.+?\}\}/g.
1190: 65 78 65 63 28 73 4c 69 6e 65 29 0a 20 20 20 20  exec(sLine).    
11a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 6c              // l
11b0: 69 6e 65 73 20 62 65 6c 6f 77 20 74 6f 20 72 65  ines below to re
11c0: 6d 6f 76 65 20 77 68 65 6e 20 49 20 6b 6e 6f 77  move when I know
11d0: 20 77 68 79 2e 0a 20 20 20 20 20 20 20 20 20 20   why..          
11e0: 20 20 20 20 20 20 69 66 20 28 69 20 3e 20 31 30        if (i > 10
11f0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
1200: 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e          console.
1210: 6c 6f 67 28 22 5c 6e 69 6e 66 69 6e 69 74 65 20  log("\ninfinite 
1220: 6c 6f 6f 70 3f 5c 6e 6c 69 6e 65 3a 22 2b 73 4c  loop?\nline:"+sL
1230: 69 6e 65 2b 22 5c 6e 6d 3a 20 22 2b 20 6d 2e 74  ine+"\nm: "+ m.t
1240: 6f 53 74 72 69 6e 67 28 29 29 3b 0a 20 20 20 20  oString());.    
1250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1260: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1270: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1280: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1290: 20 20 20 72 65 74 75 72 6e 20 73 52 65 73 3b 0a     return sRes;.
12a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12b0: 20 20 63 61 74 63 68 20 28 65 29 20 7b 0a 20 20    catch (e) {.  
12c0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c            consol
12d0: 65 2e 65 72 72 6f 72 28 65 29 3b 0a 20 20 20 20  e.error(e);.    
12e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
12f0: 74 75 72 6e 20 22 20 22 2e 72 65 70 65 61 74 28  turn " ".repeat(
1300: 73 4c 69 6e 65 2e 6c 65 6e 67 74 68 29 3b 0a 20  sLine.length);. 
1310: 20 20 20 7d 0a 0a 20 20 20 20 5f 67 65 74 46 6f     }..    _getFo
1320: 75 6e 64 45 72 72 6f 72 73 20 28 73 4c 69 6e 65  undErrors (sLine
1330: 2c 20 62 44 65 62 75 67 2c 20 73 4f 70 74 69 6f  , bDebug, sOptio
1340: 6e 29 20 7b 0a 20 20 20 20 20 20 20 20 74 72 79  n) {.        try
1350: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c   {.            l
1360: 65 74 20 61 45 72 72 73 20 3d 20 5b 5d 3b 0a 20  et aErrs = [];. 
1370: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 73             if (s
1380: 4f 70 74 69 6f 6e 29 20 7b 0a 20 20 20 20 20 20  Option) {.      
1390: 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 67            this.g
13a0: 63 65 2e 73 65 74 4f 70 74 69 6f 6e 28 73 4f 70  ce.setOption(sOp
13b0: 74 69 6f 6e 2c 20 74 72 75 65 29 3b 0a 20 20 20  tion, true);.   
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 45 72               aEr
13d0: 72 73 20 3d 20 74 68 69 73 2e 67 63 65 2e 70 61  rs = this.gce.pa
13e0: 72 73 65 28 73 4c 69 6e 65 2c 20 22 46 52 22 2c  rse(sLine, "FR",
13f0: 20 62 44 65 62 75 67 29 3b 0a 20 20 20 20 20 20   bDebug);.      
1400: 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 67            this.g
1410: 63 65 2e 73 65 74 4f 70 74 69 6f 6e 28 73 4f 70  ce.setOption(sOp
1420: 74 69 6f 6e 2c 20 66 61 6c 73 65 29 3b 0a 20 20  tion, false);.  
1430: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
1440: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
1450: 20 20 20 61 45 72 72 73 20 3d 20 74 68 69 73 2e     aErrs = this.
1460: 67 63 65 2e 70 61 72 73 65 28 73 4c 69 6e 65 2c  gce.parse(sLine,
1470: 20 22 46 52 22 2c 20 62 44 65 62 75 67 29 3b 0a   "FR", bDebug);.
1480: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1490: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 73 52            let sR
14a0: 65 73 20 3d 20 22 20 22 2e 72 65 70 65 61 74 28  es = " ".repeat(
14b0: 73 4c 69 6e 65 2e 6c 65 6e 67 74 68 29 3b 0a 20  sLine.length);. 
14c0: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 73             let s
14d0: 4c 69 73 74 45 72 72 20 3d 20 22 22 3b 0a 20 20  ListErr = "";.  
14e0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c            for (l
14f0: 65 74 20 64 45 72 72 20 6f 66 20 61 45 72 72 73  et dErr of aErrs
1500: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
1510: 20 20 20 20 73 52 65 73 20 3d 20 73 52 65 73 2e      sRes = sRes.
1520: 73 6c 69 63 65 28 30 2c 20 64 45 72 72 5b 22 6e  slice(0, dErr["n
1530: 53 74 61 72 74 22 5d 29 20 2b 20 22 7e 22 2e 72  Start"]) + "~".r
1540: 65 70 65 61 74 28 64 45 72 72 5b 22 6e 45 6e 64  epeat(dErr["nEnd
1550: 22 5d 20 2d 20 64 45 72 72 5b 22 6e 53 74 61 72  "] - dErr["nStar
1560: 74 22 5d 29 20 2b 20 73 52 65 73 2e 73 6c 69 63  t"]) + sRes.slic
1570: 65 28 64 45 72 72 5b 22 6e 45 6e 64 22 5d 29 3b  e(dErr["nEnd"]);
1580: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1590: 20 73 4c 69 73 74 45 72 72 20 2b 3d 20 22 20 20   sListErr += "  
15a0: 20 20 2a 20 7b 22 20 2b 20 64 45 72 72 5b 27 73    * {" + dErr['s
15b0: 4c 69 6e 65 49 64 27 5d 20 2b 20 22 20 2f 20 22  LineId'] + " / "
15c0: 20 2b 20 64 45 72 72 5b 27 73 52 75 6c 65 49 64   + dErr['sRuleId
15d0: 27 5d 20 2b 20 22 7d 20 20 61 74 20 20 22 20 2b  '] + "}  at  " +
15e0: 20 64 45 72 72 5b 27 6e 53 74 61 72 74 27 5d 20   dErr['nStart'] 
15f0: 2b 20 22 3a 22 20 2b 20 64 45 72 72 5b 27 6e 45  + ":" + dErr['nE
1600: 6e 64 27 5d 20 2b 20 22 5c 6e 22 3b 0a 20 20 20  nd'] + "\n";.   
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69               thi
1620: 73 2e 5f 61 52 75 6c 65 54 65 73 74 65 64 2e 61  s._aRuleTested.a
1630: 64 64 28 64 45 72 72 5b 22 73 4c 69 6e 65 49 64  dd(dErr["sLineId
1640: 22 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  "]);.           
1650: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72   }.            r
1660: 65 74 75 72 6e 20 5b 73 52 65 73 2c 20 73 4c 69  eturn [sRes, sLi
1670: 73 74 45 72 72 5d 3b 0a 20 20 20 20 20 20 20 20  stErr];.        
1680: 7d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20  }.        catch 
1690: 28 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  (e) {.          
16a0: 20 20 63 6f 6e 73 6f 6c 65 2e 65 72 72 6f 72 28    console.error(
16b0: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
16c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 22 20        return [" 
16d0: 22 2e 72 65 70 65 61 74 28 73 4c 69 6e 65 2e 6c  ".repeat(sLine.l
16e0: 65 6e 67 74 68 29 2c 20 22 22 5d 3b 0a 20 20 20  ength), ""];.   
16f0: 20 7d 0a 0a 7d 0a 0a 0a 69 66 20 28 74 79 70 65   }..}...if (type
1700: 6f 66 28 65 78 70 6f 72 74 73 29 20 21 3d 3d 20  of(exports) !== 
1710: 27 75 6e 64 65 66 69 6e 65 64 27 29 20 7b 0a 20  'undefined') {. 
1720: 20 20 20 65 78 70 6f 72 74 73 2e 54 65 73 74 47     exports.TestG
1730: 72 61 6d 6d 61 72 43 68 65 63 6b 69 6e 67 20 3d  rammarChecking =
1740: 20 54 65 73 74 47 72 61 6d 6d 61 72 43 68 65 63   TestGrammarChec
1750: 6b 69 6e 67 3b 0a 7d 0a                          king;.}.