⌈⌋ ⎇ branch:  Bitrhythm


Hex Artifact Content

Artifact 1555ef2c1cffaeb0b25b34c76551f1c139402dbeb385114ca9143c097321786d:


0000: 69 6d 70 6f 72 74 20 7b 0a 20 20 69 6e 6a 65 63  import {.  injec
0010: 74 48 54 4d 4c 2c 0a 20 20 24 2c 0a 20 20 24 24  tHTML,.  $,.  $$
0020: 2c 0a 20 20 49 45 5f 56 45 52 53 49 4f 4e 2c 0a  ,.  IE_VERSION,.
0030: 20 20 6e 6f 72 6d 61 6c 69 7a 65 48 54 4d 4c 2c    normalizeHTML,
0040: 0a 20 20 66 69 72 65 45 76 65 6e 74 2c 0a 20 20  .  fireEvent,.  
0050: 67 65 74 43 61 72 72 6f 74 50 6f 73 2c 0a 20 20  getCarrotPos,.  
0060: 73 65 74 43 61 72 72 6f 74 50 6f 73 0a 7d 20 66  setCarrotPos.} f
0070: 72 6f 6d 20 27 2e 2e 2f 2e 2e 2f 2e 2e 2f 68 65  rom '../../../he
0080: 6c 70 65 72 73 2f 69 6e 64 65 78 27 0a 0a 2f 2f  lpers/index'..//
0090: 20 69 6e 63 6c 75 64 65 20 73 70 65 63 69 61 6c   include special
00a0: 20 74 61 67 73 20 74 6f 20 74 65 73 74 20 73 70   tags to test sp
00b0: 65 63 69 66 69 63 20 66 65 61 74 75 72 65 73 0a  ecific features.
00c0: 69 6d 70 6f 72 74 20 27 2e 2e 2f 2e 2e 2f 2e 2e  import '../../..
00d0: 2f 74 61 67 2f 76 2d 64 6f 6d 2d 31 2e 74 61 67  /tag/v-dom-1.tag
00e0: 27 0a 69 6d 70 6f 72 74 20 27 2e 2e 2f 2e 2e 2f  '.import '../../
00f0: 2e 2e 2f 74 61 67 2f 76 2d 64 6f 6d 2d 32 2e 74  ../tag/v-dom-2.t
0100: 61 67 27 0a 69 6d 70 6f 72 74 20 27 2e 2e 2f 2e  ag'.import '../.
0110: 2e 2f 2e 2e 2f 74 61 67 2f 74 69 6d 65 74 61 62  ./../tag/timetab
0120: 6c 65 2e 74 61 67 27 0a 69 6d 70 6f 72 74 20 27  le.tag'.import '
0130: 2e 2e 2f 2e 2e 2f 2e 2e 2f 74 61 67 2f 6e 65 73  ../../../tag/nes
0140: 74 65 64 2d 63 68 69 6c 64 2e 74 61 67 27 0a 69  ted-child.tag'.i
0150: 6d 70 6f 72 74 20 27 2e 2e 2f 2e 2e 2f 2e 2e 2f  mport '../../../
0160: 74 61 67 2f 74 6f 70 2d 61 74 74 72 69 62 75 74  tag/top-attribut
0170: 65 73 2e 74 61 67 27 0a 69 6d 70 6f 72 74 20 27  es.tag'.import '
0180: 2e 2e 2f 2e 2e 2f 2e 2e 2f 74 61 67 2f 70 72 65  ../../../tag/pre
0190: 73 65 72 76 65 2d 61 74 74 72 2e 74 61 67 27 0a  serve-attr.tag'.
01a0: 69 6d 70 6f 72 74 20 27 2e 2e 2f 2e 2e 2f 2e 2e  import '../../..
01b0: 2f 74 61 67 2f 73 76 67 2d 61 74 74 72 2e 74 61  /tag/svg-attr.ta
01c0: 67 27 0a 69 6d 70 6f 72 74 20 27 2e 2e 2f 2e 2e  g'.import '../..
01d0: 2f 2e 2e 2f 74 61 67 2f 6e 61 6d 65 64 2d 63 68  /../tag/named-ch
01e0: 69 6c 64 2e 74 61 67 27 0a 69 6d 70 6f 72 74 20  ild.tag'.import 
01f0: 27 2e 2e 2f 2e 2e 2f 2e 2e 2f 74 61 67 2f 64 65  '../../../tag/de
0200: 66 65 72 72 65 64 2d 6d 6f 75 6e 74 2e 74 61 67  ferred-mount.tag
0210: 27 0a 69 6d 70 6f 72 74 20 27 2e 2e 2f 2e 2e 2f  '.import '../../
0220: 2e 2e 2f 74 61 67 2f 70 72 65 76 65 6e 74 2d 75  ../tag/prevent-u
0230: 70 64 61 74 65 2e 74 61 67 27 0a 69 6d 70 6f 72  pdate.tag'.impor
0240: 74 20 27 2e 2e 2f 2e 2e 2f 2e 2e 2f 74 61 67 2f  t '../../../tag/
0250: 65 78 70 72 65 73 73 69 6f 6e 2d 65 76 61 6c 2d  expression-eval-
0260: 63 6f 75 6e 74 2e 74 61 67 27 0a 69 6d 70 6f 72  count.tag'.impor
0270: 74 20 27 2e 2e 2f 2e 2e 2f 2e 2e 2f 74 61 67 2f  t '../../../tag/
0280: 6d 75 6c 74 69 2d 6e 61 6d 65 64 2e 74 61 67 27  multi-named.tag'
0290: 0a 69 6d 70 6f 72 74 20 27 2e 2e 2f 2e 2e 2f 2e  .import '../../.
02a0: 2e 2f 74 61 67 2f 6e 61 6d 65 64 2d 64 61 74 61  ./tag/named-data
02b0: 2d 72 65 66 2e 74 61 67 27 0a 69 6d 70 6f 72 74  -ref.tag'.import
02c0: 20 27 2e 2e 2f 2e 2e 2f 2e 2e 2f 74 61 67 2f 69   '../../../tag/i
02d0: 6e 70 75 74 2d 6e 75 6d 62 65 72 2e 74 61 67 27  nput-number.tag'
02e0: 0a 69 6d 70 6f 72 74 20 27 2e 2e 2f 2e 2e 2f 2e  .import '../../.
02f0: 2e 2f 74 61 67 2f 69 6e 70 75 74 2d 76 61 6c 75  ./tag/input-valu
0300: 65 73 2e 74 61 67 27 0a 69 6d 70 6f 72 74 20 27  es.tag'.import '
0310: 2e 2e 2f 2e 2e 2f 2e 2e 2f 74 61 67 2f 69 6e 70  ../../../tag/inp
0320: 75 74 2d 75 70 64 61 74 65 64 2e 74 61 67 27 0a  ut-updated.tag'.
0330: 69 6d 70 6f 72 74 20 27 2e 2e 2f 2e 2e 2f 2e 2e  import '../../..
0340: 2f 74 61 67 2f 6e 65 73 74 65 64 2d 72 69 6f 74  /tag/nested-riot
0350: 2e 74 61 67 27 0a 69 6d 70 6f 72 74 20 27 2e 2e  .tag'.import '..
0360: 2f 2e 2e 2f 2e 2e 2f 74 61 67 2f 74 72 65 65 76  /../../tag/treev
0370: 69 65 77 2e 74 61 67 27 0a 69 6d 70 6f 72 74 20  iew.tag'.import 
0380: 27 2e 2e 2f 2e 2e 2f 2e 2e 2f 74 61 67 2f 65 76  '../../../tag/ev
0390: 65 6e 74 73 2e 74 61 67 27 0a 69 6d 70 6f 72 74  ents.tag'.import
03a0: 20 27 2e 2e 2f 2e 2e 2f 2e 2e 2f 74 61 67 2f 72   '../../../tag/r
03b0: 75 6e 74 69 6d 65 2d 65 76 65 6e 74 2d 6c 69 73  untime-event-lis
03c0: 74 65 6e 65 72 2d 73 77 69 74 63 68 2e 74 61 67  tener-switch.tag
03d0: 27 0a 69 6d 70 6f 72 74 20 27 2e 2e 2f 2e 2e 2f  '.import '../../
03e0: 2e 2e 2f 74 61 67 2f 73 68 6f 75 6c 64 2d 75 70  ../tag/should-up
03f0: 64 61 74 65 2e 74 61 67 27 0a 69 6d 70 6f 72 74  date.tag'.import
0400: 20 27 2e 2e 2f 2e 2e 2f 2e 2e 2f 74 61 67 2f 73   '../../../tag/s
0410: 68 6f 75 6c 64 2d 75 70 64 61 74 65 2d 6f 70 74  hould-update-opt
0420: 73 2e 74 61 67 27 0a 69 6d 70 6f 72 74 20 27 2e  s.tag'.import '.
0430: 2e 2f 2e 2e 2f 2e 2e 2f 74 61 67 2f 6f 62 73 65  ./../../tag/obse
0440: 72 76 61 62 6c 65 2d 61 74 74 72 2e 74 61 67 27  rvable-attr.tag'
0450: 0a 69 6d 70 6f 72 74 20 27 2e 2e 2f 2e 2e 2f 2e  .import '../../.
0460: 2e 2f 74 61 67 2f 76 69 72 74 75 61 6c 2d 6e 65  ./tag/virtual-ne
0470: 73 74 65 64 2d 75 6e 6d 6f 75 6e 74 2e 74 61 67  sted-unmount.tag
0480: 27 0a 69 6d 70 6f 72 74 20 27 2e 2e 2f 2e 2e 2f  '.import '../../
0490: 2e 2e 2f 74 61 67 2f 76 69 72 74 75 61 6c 2d 63  ../tag/virtual-c
04a0: 6f 6e 64 69 74 69 6f 6e 61 6c 2e 74 61 67 27 0a  onditional.tag'.
04b0: 69 6d 70 6f 72 74 20 27 2e 2e 2f 2e 2e 2f 2e 2e  import '../../..
04c0: 2f 74 61 67 2f 66 6f 72 6d 2d 63 6f 6e 74 72 6f  /tag/form-contro
04d0: 6c 73 2e 74 61 67 27 0a 69 6d 70 6f 72 74 20 27  ls.tag'.import '
04e0: 2e 2e 2f 2e 2e 2f 2e 2e 2f 74 61 67 2f 64 61 74  ../../../tag/dat
04f0: 61 2d 69 73 2e 74 61 67 27 0a 69 6d 70 6f 72 74  a-is.tag'.import
0500: 20 27 2e 2e 2f 2e 2e 2f 2e 2e 2f 74 61 67 2f 76   '../../../tag/v
0510: 69 72 74 75 61 6c 2d 6e 65 73 74 65 64 2d 63 6f  irtual-nested-co
0520: 6d 70 6f 6e 65 6e 74 2e 74 61 67 27 0a 69 6d 70  mponent.tag'.imp
0530: 6f 72 74 20 27 2e 2e 2f 2e 2e 2f 2e 2e 2f 74 61  ort '../../../ta
0540: 67 2f 64 79 6e 61 6d 69 63 2d 64 61 74 61 2d 69  g/dynamic-data-i
0550: 73 2e 74 61 67 27 0a 69 6d 70 6f 72 74 20 27 2e  s.tag'.import '.
0560: 2e 2f 2e 2e 2f 2e 2e 2f 74 61 67 2f 75 70 64 61  ./../../tag/upda
0570: 74 65 2d 63 6f 6e 74 65 78 74 2e 74 61 67 27 0a  te-context.tag'.
0580: 69 6d 70 6f 72 74 20 27 2e 2e 2f 2e 2e 2f 2e 2e  import '../../..
0590: 2f 74 61 67 2f 64 79 6e 61 6d 69 63 2d 76 69 72  /tag/dynamic-vir
05a0: 74 75 61 6c 2e 74 61 67 27 0a 69 6d 70 6f 72 74  tual.tag'.import
05b0: 20 27 2e 2e 2f 2e 2e 2f 2e 2e 2f 74 61 67 2f 6d   '../../../tag/m
05c0: 75 6c 74 69 70 6c 65 2d 73 65 6c 65 63 74 2e 74  ultiple-select.t
05d0: 61 67 27 0a 69 6d 70 6f 72 74 20 27 2e 2e 2f 2e  ag'.import '../.
05e0: 2e 2f 2e 2e 2f 74 61 67 2f 64 79 6e 61 6d 69 63  ./../tag/dynamic
05f0: 2d 6e 65 73 74 65 64 2e 74 61 67 27 0a 69 6d 70  -nested.tag'.imp
0600: 6f 72 74 20 27 2e 2e 2f 2e 2e 2f 2e 2e 2f 74 61  ort '../../../ta
0610: 67 2f 62 75 67 2d 32 36 32 39 2e 74 61 67 27 0a  g/bug-2629.tag'.
0620: 0a 64 65 73 63 72 69 62 65 28 27 52 69 6f 74 20  .describe('Riot 
0630: 63 6f 72 65 27 2c 20 66 75 6e 63 74 69 6f 6e 28  core', function(
0640: 29 20 7b 0a 20 20 69 74 28 27 52 69 6f 74 20 65  ) {.  it('Riot e
0650: 78 69 73 74 73 27 2c 20 66 75 6e 63 74 69 6f 6e  xists', function
0660: 20 28 29 20 7b 0a 20 20 20 20 65 78 70 65 63 74   () {.    expect
0670: 28 72 69 6f 74 29 2e 74 6f 2e 62 65 2e 6e 6f 74  (riot).to.be.not
0680: 2e 75 6e 64 65 66 69 6e 65 64 0a 20 20 7d 29 0a  .undefined.  }).
0690: 0a 20 20 62 65 66 6f 72 65 28 66 75 6e 63 74 69  .  before(functi
06a0: 6f 6e 28 29 20 7b 0a 20 20 20 20 2f 2f 20 67 65  on() {.    // ge
06b0: 6e 65 72 61 6c 20 74 61 67 0a 20 20 20 20 72 69  neral tag.    ri
06c0: 6f 74 2e 74 61 67 28 27 74 65 73 74 27 2c 20 27  ot.tag('test', '
06d0: 3c 70 3e 76 61 6c 3a 20 7b 20 6f 70 74 73 2e 76  <p>val: { opts.v
06e0: 61 6c 20 7d 3c 2f 70 3e 27 29 0a 20 20 7d 29 0a  al }</p>').  }).
06f0: 0a 20 20 69 74 28 27 69 74 20 73 68 6f 75 6c 64  .  it('it should
0700: 20 65 78 70 6f 72 74 20 74 68 65 20 63 75 72 72   export the curr
0710: 65 6e 74 20 72 69 6f 74 20 62 75 69 6c 64 20 76  ent riot build v
0720: 65 72 73 69 6f 6e 20 61 73 20 73 74 72 69 6e 67  ersion as string
0730: 27 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a  ', function() {.
0740: 20 20 20 20 65 78 70 65 63 74 28 72 69 6f 74 2e      expect(riot.
0750: 76 65 72 73 69 6f 6e 29 2e 74 6f 2e 62 65 2e 61  version).to.be.a
0760: 28 27 73 74 72 69 6e 67 27 29 0a 20 20 7d 29 0a  ('string').  }).
0770: 0a 20 20 69 74 28 27 70 6f 70 75 6c 61 74 65 73  .  it('populates
0780: 20 74 68 65 20 76 64 6f 6d 20 70 72 6f 70 65 72   the vdom proper
0790: 74 79 20 63 6f 72 72 65 63 74 6c 79 20 6f 6e 20  ty correctly on 
07a0: 72 69 6f 74 20 67 6c 6f 62 61 6c 27 2c 20 66 75  riot global', fu
07b0: 6e 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20 69  nction() {.    i
07c0: 6e 6a 65 63 74 48 54 4d 4c 28 27 3c 76 2d 64 6f  njectHTML('<v-do
07d0: 6d 2d 31 3e 3c 2f 76 2d 64 6f 6d 2d 31 3e 27 29  m-1></v-dom-1>')
07e0: 0a 20 20 20 20 69 6e 6a 65 63 74 48 54 4d 4c 28  .    injectHTML(
07f0: 27 3c 76 2d 64 6f 6d 2d 32 3e 3c 2f 76 2d 64 6f  '<v-dom-2></v-do
0800: 6d 2d 32 3e 27 29 0a 20 20 20 20 76 61 72 20 74  m-2>').    var t
0810: 61 67 73 20 3d 20 72 69 6f 74 2e 6d 6f 75 6e 74  ags = riot.mount
0820: 28 27 76 2d 64 6f 6d 2d 31 2c 20 76 2d 64 6f 6d  ('v-dom-1, v-dom
0830: 2d 32 27 29 0a 0a 20 20 20 20 65 78 70 65 63 74  -2')..    expect
0840: 28 74 61 67 73 2e 6c 65 6e 67 74 68 29 2e 74 6f  (tags.length).to
0850: 2e 62 65 2e 65 71 75 61 6c 28 32 29 0a 20 20 20  .be.equal(2).   
0860: 20 65 78 70 65 63 74 28 72 69 6f 74 2e 75 74 69   expect(riot.uti
0870: 6c 2e 76 64 6f 6d 29 2e 74 6f 2e 68 61 76 65 2e  l.vdom).to.have.
0880: 6c 65 6e 67 74 68 28 74 61 67 73 2e 6c 65 6e 67  length(tags.leng
0890: 74 68 29 0a 20 20 20 20 72 69 6f 74 2e 75 74 69  th).    riot.uti
08a0: 6c 2e 76 64 6f 6d 2e 66 6f 72 45 61 63 68 28 66  l.vdom.forEach(f
08b0: 75 6e 63 74 69 6f 6e 28 74 61 67 2c 20 69 29 20  unction(tag, i) 
08c0: 7b 0a 20 20 20 20 20 20 65 78 70 65 63 74 28 74  {.      expect(t
08d0: 61 67 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28  ag).to.be.equal(
08e0: 74 61 67 73 5b 69 5d 29 0a 20 20 20 20 7d 29 0a  tags[i]).    }).
08f0: 20 20 20 20 74 61 67 73 2e 66 6f 72 45 61 63 68      tags.forEach
0900: 28 74 61 67 20 3d 3e 20 74 61 67 2e 75 6e 6d 6f  (tag => tag.unmo
0910: 75 6e 74 28 29 29 0a 20 20 7d 29 0a 0a 20 20 69  unt()).  })..  i
0920: 74 28 27 72 69 6f 74 20 63 61 6e 20 62 65 20 65  t('riot can be e
0930: 78 74 65 6e 64 65 64 27 2c 20 66 75 6e 63 74 69  xtended', functi
0940: 6f 6e 28 29 20 7b 0a 20 20 20 20 72 69 6f 74 2e  on() {.    riot.
0950: 72 6f 75 74 65 20 3d 20 66 75 6e 63 74 69 6f 6e  route = function
0960: 28 29 20 7b 7d 0a 0a 20 20 20 20 65 78 70 65 63  () {}..    expec
0970: 74 28 72 69 6f 74 2e 72 6f 75 74 65 29 2e 74 6f  t(riot.route).to
0980: 2e 62 65 2e 61 28 27 66 75 6e 63 74 69 6f 6e 27  .be.a('function'
0990: 29 0a 0a 20 20 20 20 72 69 6f 74 2e 75 74 69 6c  )..    riot.util
09a0: 2e 74 6d 70 6c 2e 65 72 72 6f 72 48 61 6e 64 6c  .tmpl.errorHandl
09b0: 65 20 3d 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b  e = function() {
09c0: 7d 0a 0a 20 20 20 20 65 78 70 65 63 74 28 72 69  }..    expect(ri
09d0: 6f 74 2e 75 74 69 6c 2e 74 6d 70 6c 2e 65 72 72  ot.util.tmpl.err
09e0: 6f 72 48 61 6e 64 6c 65 29 2e 74 6f 2e 62 65 2e  orHandle).to.be.
09f0: 61 28 27 66 75 6e 63 74 69 6f 6e 27 29 0a 20 20  a('function').  
0a00: 7d 29 0a 0a 20 20 69 74 28 27 6d 6f 75 6e 74 20  })..  it('mount 
0a10: 61 6e 64 20 75 6e 6d 6f 75 6e 74 27 2c 20 66 75  and unmount', fu
0a20: 6e 63 74 69 6f 6e 28 29 20 7b 0a 0a 20 20 20 20  nction() {..    
0a30: 69 6e 6a 65 63 74 48 54 4d 4c 28 5b 0a 20 20 20  injectHTML([.   
0a40: 20 20 20 27 3c 74 65 73 74 20 69 64 3d 22 74 65     '<test id="te
0a50: 73 74 2d 74 61 67 22 3e 3c 2f 74 65 73 74 3e 27  st-tag"></test>'
0a60: 2c 0a 20 20 20 20 20 20 27 3c 64 69 76 20 69 64  ,.      '<div id
0a70: 3d 22 66 6f 6f 22 3e 3c 2f 64 69 76 3e 27 2c 0a  ="foo"></div>',.
0a80: 20 20 20 20 20 20 27 3c 64 69 76 20 69 64 3d 22        '<div id="
0a90: 62 61 72 22 3e 3c 2f 64 69 76 3e 27 0a 20 20 20  bar"></div>'.   
0aa0: 20 5d 29 0a 0a 20 20 20 20 76 61 72 20 74 61 67   ])..    var tag
0ab0: 20 3d 20 72 69 6f 74 2e 6d 6f 75 6e 74 28 27 74   = riot.mount('t
0ac0: 65 73 74 27 2c 20 7b 20 76 61 6c 3a 20 31 30 20  est', { val: 10 
0ad0: 7d 29 5b 30 5d 2c 0a 20 20 20 20 20 20 74 61 67  })[0],.      tag
0ae0: 32 20 3d 20 72 69 6f 74 2e 6d 6f 75 6e 74 28 27  2 = riot.mount('
0af0: 23 66 6f 6f 27 2c 20 27 74 65 73 74 27 2c 20 7b  #foo', 'test', {
0b00: 20 76 61 6c 3a 20 33 30 20 7d 29 5b 30 5d 2c 0a   val: 30 })[0],.
0b10: 20 20 20 20 20 20 74 61 67 33 20 3d 20 72 69 6f        tag3 = rio
0b20: 74 2e 6d 6f 75 6e 74 28 24 28 27 23 62 61 72 27  t.mount($('#bar'
0b30: 29 2c 20 27 74 65 73 74 27 2c 20 7b 20 76 61 6c  ), 'test', { val
0b40: 3a 20 35 30 20 7d 29 5b 30 5d 0a 0a 20 20 20 20  : 50 })[0]..    
0b50: 65 78 70 65 63 74 28 6e 6f 72 6d 61 6c 69 7a 65  expect(normalize
0b60: 48 54 4d 4c 28 74 61 67 2e 72 6f 6f 74 2e 69 6e  HTML(tag.root.in
0b70: 6e 65 72 48 54 4d 4c 29 29 2e 74 6f 2e 62 65 2e  nerHTML)).to.be.
0b80: 65 71 75 61 6c 28 27 3c 70 3e 76 61 6c 3a 20 31  equal('<p>val: 1
0b90: 30 3c 2f 70 3e 27 29 0a 20 20 20 20 65 78 70 65  0</p>').    expe
0ba0: 63 74 28 6e 6f 72 6d 61 6c 69 7a 65 48 54 4d 4c  ct(normalizeHTML
0bb0: 28 74 61 67 32 2e 72 6f 6f 74 2e 69 6e 6e 65 72  (tag2.root.inner
0bc0: 48 54 4d 4c 29 29 2e 74 6f 2e 62 65 2e 65 71 75  HTML)).to.be.equ
0bd0: 61 6c 28 27 3c 70 3e 76 61 6c 3a 20 33 30 3c 2f  al('<p>val: 30</
0be0: 70 3e 27 29 0a 20 20 20 20 65 78 70 65 63 74 28  p>').    expect(
0bf0: 6e 6f 72 6d 61 6c 69 7a 65 48 54 4d 4c 28 74 61  normalizeHTML(ta
0c00: 67 33 2e 72 6f 6f 74 2e 69 6e 6e 65 72 48 54 4d  g3.root.innerHTM
0c10: 4c 29 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28  L)).to.be.equal(
0c20: 27 3c 70 3e 76 61 6c 3a 20 35 30 3c 2f 70 3e 27  '<p>val: 50</p>'
0c30: 29 0a 0a 20 20 20 20 74 61 67 2e 75 6e 6d 6f 75  )..    tag.unmou
0c40: 6e 74 28 29 0a 20 20 20 20 74 61 67 32 2e 75 6e  nt().    tag2.un
0c50: 6d 6f 75 6e 74 28 29 0a 20 20 20 20 74 61 67 33  mount().    tag3
0c60: 2e 75 6e 6d 6f 75 6e 74 28 74 72 75 65 29 0a 0a  .unmount(true)..
0c70: 20 20 20 20 65 78 70 65 63 74 28 74 61 67 33 2e      expect(tag3.
0c80: 69 73 4d 6f 75 6e 74 65 64 29 2e 74 6f 2e 62 65  isMounted).to.be
0c90: 2e 65 71 75 61 6c 28 66 61 6c 73 65 29 0a 0a 20  .equal(false).. 
0ca0: 20 20 20 65 78 70 65 63 74 28 24 24 28 27 74 65     expect($$('te
0cb0: 73 74 27 29 2e 6c 65 6e 67 74 68 29 2e 74 6f 2e  st').length).to.
0cc0: 62 65 2e 65 71 75 61 6c 28 30 29 0a 20 20 20 20  be.equal(0).    
0cd0: 65 78 70 65 63 74 28 24 28 27 23 66 6f 6f 27 29  expect($('#foo')
0ce0: 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 6e 75  ).to.be.equal(nu
0cf0: 6c 6c 29 0a 20 20 20 20 65 78 70 65 63 74 28 24  ll).    expect($
0d00: 28 27 23 62 61 72 27 29 29 2e 74 6f 2e 6e 6f 74  ('#bar')).to.not
0d10: 2e 62 65 2e 65 71 75 61 6c 28 6e 75 6c 6c 29 0a  .be.equal(null).
0d20: 0a 20 20 20 20 65 78 70 65 63 74 28 74 61 67 2e  .    expect(tag.
0d30: 72 6f 6f 74 2e 5f 74 61 67 29 2e 74 6f 2e 62 65  root._tag).to.be
0d40: 2e 65 71 75 61 6c 28 75 6e 64 65 66 69 6e 65 64  .equal(undefined
0d50: 29 0a 20 20 20 20 65 78 70 65 63 74 28 74 61 67  ).    expect(tag
0d60: 32 2e 72 6f 6f 74 2e 5f 74 61 67 29 2e 74 6f 2e  2.root._tag).to.
0d70: 62 65 2e 65 71 75 61 6c 28 75 6e 64 65 66 69 6e  be.equal(undefin
0d80: 65 64 29 0a 20 20 20 20 65 78 70 65 63 74 28 74  ed).    expect(t
0d90: 61 67 33 2e 72 6f 6f 74 2e 5f 74 61 67 29 2e 74  ag3.root._tag).t
0da0: 6f 2e 62 65 2e 65 71 75 61 6c 28 75 6e 64 65 66  o.be.equal(undef
0db0: 69 6e 65 64 29 0a 0a 20 20 20 20 74 61 67 33 2e  ined)..    tag3.
0dc0: 72 6f 6f 74 2e 70 61 72 65 6e 74 4e 6f 64 65 2e  root.parentNode.
0dd0: 72 65 6d 6f 76 65 43 68 69 6c 64 28 74 61 67 33  removeChild(tag3
0de0: 2e 72 6f 6f 74 29 0a 0a 20 20 7d 29 0a 0a 20 20  .root)..  })..  
0df0: 69 74 28 27 6e 6f 64 65 20 73 68 6f 75 6c 64 20  it('node should 
0e00: 6e 6f 74 20 70 72 65 73 65 72 76 65 20 61 74 74  not preserve att
0e10: 72 69 62 75 74 65 73 20 66 72 6f 6d 20 74 61 67  ributes from tag
0e20: 20 6d 6f 75 6e 74 65 64 20 6f 6e 20 69 74 20 77   mounted on it w
0e30: 68 65 6e 20 69 74 20 69 73 20 75 6e 6d 6f 75 6e  hen it is unmoun
0e40: 74 65 64 27 2c 20 66 75 6e 63 74 69 6f 6e 28 29  ted', function()
0e50: 20 7b 0a 20 20 20 20 69 6e 6a 65 63 74 48 54 4d   {.    injectHTM
0e60: 4c 28 27 3c 64 69 76 20 69 64 3d 22 6e 6f 64 65  L('<div id="node
0e70: 22 3e 3c 2f 64 69 76 3e 27 29 0a 0a 20 20 20 20  "></div>')..    
0e80: 76 61 72 20 74 61 67 20 3d 20 72 69 6f 74 2e 6d  var tag = riot.m
0e90: 6f 75 6e 74 28 27 23 6e 6f 64 65 27 2c 20 27 74  ount('#node', 't
0ea0: 6f 70 2d 61 74 74 72 69 62 75 74 65 73 27 2c 20  op-attributes', 
0eb0: 7b 20 63 6c 73 3a 20 27 74 65 73 74 27 20 7d 29  { cls: 'test' })
0ec0: 5b 30 5d 0a 0a 20 20 20 20 65 78 70 65 63 74 28  [0]..    expect(
0ed0: 74 61 67 2e 72 6f 6f 74 2e 68 61 73 41 74 74 72  tag.root.hasAttr
0ee0: 69 62 75 74 65 28 27 63 6c 61 73 73 27 29 29 2e  ibute('class')).
0ef0: 74 6f 2e 62 65 2e 65 71 75 61 6c 28 74 72 75 65  to.be.equal(true
0f00: 29 0a 20 20 20 20 65 78 70 65 63 74 28 74 61 67  ).    expect(tag
0f10: 2e 72 6f 6f 74 2e 68 61 73 41 74 74 72 69 62 75  .root.hasAttribu
0f20: 74 65 28 27 73 74 79 6c 65 27 29 29 2e 74 6f 2e  te('style')).to.
0f30: 62 65 2e 65 71 75 61 6c 28 74 72 75 65 29 0a 20  be.equal(true). 
0f40: 20 20 20 65 78 70 65 63 74 28 74 61 67 2e 72 6f     expect(tag.ro
0f50: 6f 74 2e 68 61 73 41 74 74 72 69 62 75 74 65 28  ot.hasAttribute(
0f60: 27 64 61 74 61 2d 6e 71 6c 61 73 74 27 29 29 2e  'data-nqlast')).
0f70: 74 6f 2e 62 65 2e 65 71 75 61 6c 28 74 72 75 65  to.be.equal(true
0f80: 29 0a 0a 20 20 20 20 74 61 67 2e 75 6e 6d 6f 75  )..    tag.unmou
0f90: 6e 74 28 29 0a 0a 20 20 20 20 65 78 70 65 63 74  nt()..    expect
0fa0: 28 74 61 67 2e 72 6f 6f 74 2e 68 61 73 41 74 74  (tag.root.hasAtt
0fb0: 72 69 62 75 74 65 28 27 63 6c 61 73 73 27 29 29  ribute('class'))
0fc0: 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 66 61 6c  .to.be.equal(fal
0fd0: 73 65 29 0a 20 20 20 20 65 78 70 65 63 74 28 74  se).    expect(t
0fe0: 61 67 2e 72 6f 6f 74 2e 68 61 73 41 74 74 72 69  ag.root.hasAttri
0ff0: 62 75 74 65 28 27 73 74 79 6c 65 27 29 29 2e 74  bute('style')).t
1000: 6f 2e 62 65 2e 65 71 75 61 6c 28 66 61 6c 73 65  o.be.equal(false
1010: 29 0a 20 20 20 20 65 78 70 65 63 74 28 74 61 67  ).    expect(tag
1020: 2e 72 6f 6f 74 2e 68 61 73 41 74 74 72 69 62 75  .root.hasAttribu
1030: 74 65 28 27 64 61 74 61 2d 6e 71 6c 61 73 74 27  te('data-nqlast'
1040: 29 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 66  )).to.be.equal(f
1050: 61 6c 73 65 29 0a 20 20 7d 29 0a 0a 20 20 69 74  alse).  })..  it
1060: 28 27 6d 6f 75 6e 74 20 61 20 74 61 67 20 6d 75  ('mount a tag mu
1070: 74 69 70 6c 65 20 74 69 6d 65 73 27 2c 20 66 75  tiple times', fu
1080: 6e 63 74 69 6f 6e 28 29 20 7b 0a 0a 20 20 20 20  nction() {..    
1090: 69 6e 6a 65 63 74 48 54 4d 4c 28 5b 0a 20 20 20  injectHTML([.   
10a0: 20 20 20 2f 2f 20 6d 6f 75 6e 74 20 74 68 65 20     // mount the 
10b0: 73 61 6d 65 20 74 61 67 20 6d 75 6c 74 69 70 6c  same tag multipl
10c0: 65 20 74 69 6d 65 73 0a 20 20 20 20 20 20 27 3c  e times.      '<
10d0: 64 69 76 20 69 64 3d 22 6d 75 6c 74 69 2d 6d 6f  div id="multi-mo
10e0: 75 6e 74 2d 63 6f 6e 74 61 69 6e 65 72 2d 31 22  unt-container-1"
10f0: 3e 3c 2f 64 69 76 3e 27 0a 0a 20 20 20 20 5d 29  ></div>'..    ])
1100: 0a 0a 20 20 20 20 76 61 72 20 74 61 67 20 3d 20  ..    var tag = 
1110: 72 69 6f 74 2e 6d 6f 75 6e 74 28 27 23 6d 75 6c  riot.mount('#mul
1120: 74 69 2d 6d 6f 75 6e 74 2d 63 6f 6e 74 61 69 6e  ti-mount-contain
1130: 65 72 2d 31 27 2c 20 27 74 65 73 74 27 2c 20 7b  er-1', 'test', {
1140: 20 76 61 6c 3a 20 33 30 30 20 7d 29 5b 30 5d 0a   val: 300 })[0].
1150: 0a 20 20 20 20 65 78 70 65 63 74 28 6e 6f 72 6d  .    expect(norm
1160: 61 6c 69 7a 65 48 54 4d 4c 28 74 61 67 2e 72 6f  alizeHTML(tag.ro
1170: 6f 74 2e 69 6e 6e 65 72 48 54 4d 4c 29 29 2e 74  ot.innerHTML)).t
1180: 6f 2e 62 65 2e 65 71 75 61 6c 28 27 3c 70 3e 76  o.be.equal('<p>v
1190: 61 6c 3a 20 33 30 30 3c 2f 70 3e 27 29 0a 0a 20  al: 300</p>').. 
11a0: 20 20 20 72 69 6f 74 2e 74 61 67 28 27 74 65 73     riot.tag('tes
11b0: 74 2d 68 27 2c 20 27 3c 70 3e 7b 20 78 20 7d 3c  t-h', '<p>{ x }<
11c0: 2f 70 3e 27 2c 20 66 75 6e 63 74 69 6f 6e 28 29  /p>', function()
11d0: 20 7b 20 74 68 69 73 2e 78 20 3d 20 27 6f 6b 27   { this.x = 'ok'
11e0: 7d 29 0a 0a 20 20 20 20 74 61 67 20 3d 20 72 69  })..    tag = ri
11f0: 6f 74 2e 6d 6f 75 6e 74 28 27 23 6d 75 6c 74 69  ot.mount('#multi
1200: 2d 6d 6f 75 6e 74 2d 63 6f 6e 74 61 69 6e 65 72  -mount-container
1210: 2d 31 27 2c 20 27 74 65 73 74 2d 68 27 29 5b 30  -1', 'test-h')[0
1220: 5d 0a 0a 20 20 20 20 65 78 70 65 63 74 28 6e 6f  ]..    expect(no
1230: 72 6d 61 6c 69 7a 65 48 54 4d 4c 28 74 61 67 2e  rmalizeHTML(tag.
1240: 72 6f 6f 74 2e 69 6e 6e 65 72 48 54 4d 4c 29 29  root.innerHTML))
1250: 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27 3c 70  .to.be.equal('<p
1260: 3e 6f 6b 3c 2f 70 3e 27 29 0a 0a 20 20 20 20 74  >ok</p>')..    t
1270: 61 67 2e 75 6e 6d 6f 75 6e 74 28 29 0a 0a 20 20  ag.unmount()..  
1280: 7d 29 0a 0a 20 20 69 74 28 27 63 6f 6d 70 69 6c  })..  it('compil
1290: 65 73 20 61 6e 64 20 75 6e 6d 6f 75 6e 74 20 74  es and unmount t
12a0: 68 65 20 63 68 69 6c 64 72 65 6e 20 74 61 67 73  he children tags
12b0: 27 2c 20 66 75 6e 63 74 69 6f 6e 28 64 6f 6e 65  ', function(done
12c0: 29 20 7b 0a 0a 20 20 20 20 69 6e 6a 65 63 74 48  ) {..    injectH
12d0: 54 4d 4c 28 27 3c 74 69 6d 65 74 61 62 6c 65 3e  TML('<timetable>
12e0: 3c 2f 74 69 6d 65 74 61 62 6c 65 3e 27 29 0a 0a  </timetable>')..
12f0: 20 20 20 20 74 68 69 73 2e 74 69 6d 65 6f 75 74      this.timeout
1300: 28 35 30 30 30 29 0a 0a 20 20 20 20 76 61 72 20  (5000)..    var 
1310: 74 69 63 6b 73 20 3d 20 30 2c 0a 20 20 20 20 20  ticks = 0,.     
1320: 20 74 61 67 20 3d 20 72 69 6f 74 2e 6d 6f 75 6e   tag = riot.moun
1330: 74 28 27 74 69 6d 65 74 61 62 6c 65 27 2c 20 7b  t('timetable', {
1340: 0a 20 20 20 20 20 20 20 20 73 74 61 72 74 3a 20  .        start: 
1350: 30 2c 0a 20 20 20 20 20 20 20 20 6f 6e 74 69 63  0,.        ontic
1360: 6b 3a 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a  k: function() {.
1370: 20 20 20 20 20 20 20 20 20 20 74 69 63 6b 73 2b            ticks+
1380: 2b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  +.        }.    
1390: 20 20 7d 29 5b 30 5d 0a 0a 20 20 20 20 65 78 70    })[0]..    exp
13a0: 65 63 74 28 24 24 28 27 74 69 6d 65 72 27 2c 20  ect($$('timer', 
13b0: 74 61 67 2e 72 6f 6f 74 29 2e 6c 65 6e 67 74 68  tag.root).length
13c0: 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 33 29  ).to.be.equal(3)
13d0: 0a 0a 20 20 20 20 72 69 6f 74 2e 75 70 64 61 74  ..    riot.updat
13e0: 65 28 29 0a 0a 20 20 20 20 65 78 70 65 63 74 28  e()..    expect(
13f0: 74 61 67 2e 74 61 67 73 2e 66 6f 6f 29 2e 74 6f  tag.tags.foo).to
1400: 2e 6e 6f 74 2e 62 65 2e 65 71 75 61 6c 28 75 6e  .not.be.equal(un
1410: 64 65 66 69 6e 65 64 29 0a 0a 20 20 20 20 74 61  defined)..    ta
1420: 67 2e 75 6e 6d 6f 75 6e 74 28 29 0a 0a 20 20 20  g.unmount()..   
1430: 20 2f 2f 20 6e 6f 20 74 69 6d 65 20 6e 65 69 74   // no time neit
1440: 68 65 72 20 66 6f 72 20 6f 6e 65 20 74 69 63 6b  her for one tick
1450: 0a 20 20 20 20 2f 2f 20 62 65 63 61 75 73 65 20  .    // because 
1460: 74 68 65 20 74 61 67 20 67 6f 74 20 75 6e 4d 6f  the tag got unMo
1470: 75 6e 74 65 64 20 74 6f 6f 20 65 61 72 6c 79 0a  unted too early.
1480: 20 20 20 20 73 65 74 54 69 6d 65 6f 75 74 28 66      setTimeout(f
1490: 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20  unction() {.    
14a0: 20 20 65 78 70 65 63 74 28 74 69 63 6b 73 29 2e    expect(ticks).
14b0: 74 6f 2e 62 65 2e 65 71 75 61 6c 28 30 29 0a 20  to.be.equal(0). 
14c0: 20 20 20 20 20 64 6f 6e 65 28 29 0a 20 20 20 20       done().    
14d0: 7d 2c 20 31 32 30 30 29 0a 0a 20 20 7d 29 0a 0a  }, 1200)..  })..
14e0: 20 20 69 74 28 27 6d 6f 75 6e 74 20 61 20 74 61    it('mount a ta
14f0: 67 20 6d 75 74 69 70 6c 65 20 74 69 6d 65 73 20  g mutiple times 
1500: 75 73 69 6e 67 20 22 2a 22 27 2c 20 66 75 6e 63  using "*"', func
1510: 74 69 6f 6e 28 29 20 7b 0a 0a 20 20 20 20 69 6e  tion() {..    in
1520: 6a 65 63 74 48 54 4d 4c 28 5b 0a 20 20 20 20 20  jectHTML([.     
1530: 20 2f 2f 20 6d 75 6c 74 70 6c 65 20 6d 6f 75 6e   // multple moun
1540: 74 20 75 73 69 6e 67 20 2a 0a 20 20 20 20 20 20  t using *.      
1550: 27 3c 64 69 76 20 69 64 3d 22 6d 75 6c 74 69 2d  '<div id="multi-
1560: 6d 6f 75 6e 74 2d 63 6f 6e 74 61 69 6e 65 72 2d  mount-container-
1570: 32 22 3e 27 2c 0a 20 20 20 20 20 20 27 20 20 20  2">',.      '   
1580: 20 3c 74 65 73 74 2d 69 3e 3c 2f 74 65 73 74 2d   <test-i></test-
1590: 69 3e 27 2c 0a 20 20 20 20 20 20 27 20 20 20 20  i>',.      '    
15a0: 3c 74 65 73 74 2d 6c 3e 3c 2f 74 65 73 74 2d 6c  <test-l></test-l
15b0: 3e 27 2c 0a 20 20 20 20 20 20 27 20 20 20 20 3c  >',.      '    <
15c0: 74 65 73 74 2d 6d 3e 3c 2f 74 65 73 74 2d 6d 3e  test-m></test-m>
15d0: 27 2c 0a 20 20 20 20 20 20 27 3c 2f 64 69 76 3e  ',.      '</div>
15e0: 27 0a 20 20 20 20 5d 29 0a 0a 20 20 20 20 72 69  '.    ])..    ri
15f0: 6f 74 2e 74 61 67 28 27 74 65 73 74 2d 69 27 2c  ot.tag('test-i',
1600: 20 27 3c 70 3e 7b 20 78 20 7d 3c 2f 70 3e 27 2c   '<p>{ x }</p>',
1610: 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 20 74 68   function() { th
1620: 69 73 2e 78 20 3d 20 27 6f 6b 27 7d 29 0a 20 20  is.x = 'ok'}).  
1630: 20 20 72 69 6f 74 2e 74 61 67 28 27 74 65 73 74    riot.tag('test
1640: 2d 6c 27 2c 20 27 3c 70 3e 7b 20 78 20 7d 3c 2f  -l', '<p>{ x }</
1650: 70 3e 27 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20  p>', function() 
1660: 7b 20 74 68 69 73 2e 78 20 3d 20 27 6f 6b 27 7d  { this.x = 'ok'}
1670: 29 0a 20 20 20 20 72 69 6f 74 2e 74 61 67 28 27  ).    riot.tag('
1680: 74 65 73 74 2d 6d 27 2c 20 27 3c 70 3e 7b 20 78  test-m', '<p>{ x
1690: 20 7d 3c 2f 70 3e 27 2c 20 66 75 6e 63 74 69 6f   }</p>', functio
16a0: 6e 28 29 20 7b 20 74 68 69 73 2e 78 20 3d 20 27  n() { this.x = '
16b0: 6f 6b 27 7d 29 0a 0a 20 20 20 20 63 6f 6e 73 74  ok'})..    const
16c0: 20 63 6f 6e 74 61 69 6e 65 72 20 3d 20 24 28 27   container = $('
16d0: 23 6d 75 6c 74 69 2d 6d 6f 75 6e 74 2d 63 6f 6e  #multi-mount-con
16e0: 74 61 69 6e 65 72 2d 32 27 29 0a 20 20 20 20 76  tainer-2').    v
16f0: 61 72 20 73 75 62 54 61 67 73 20 3d 20 72 69 6f  ar subTags = rio
1700: 74 2e 6d 6f 75 6e 74 28 27 23 6d 75 6c 74 69 2d  t.mount('#multi-
1710: 6d 6f 75 6e 74 2d 63 6f 6e 74 61 69 6e 65 72 2d  mount-container-
1720: 32 27 2c 20 27 2a 27 29 0a 0a 20 20 20 20 65 78  2', '*')..    ex
1730: 70 65 63 74 28 73 75 62 54 61 67 73 2e 6c 65 6e  pect(subTags.len
1740: 67 74 68 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c  gth).to.be.equal
1750: 28 33 29 0a 0a 20 20 20 20 73 75 62 54 61 67 73  (3)..    subTags
1760: 20 3d 20 72 69 6f 74 2e 6d 6f 75 6e 74 28 63 6f   = riot.mount(co
1770: 6e 74 61 69 6e 65 72 2c 20 27 2a 27 29 0a 0a 20  ntainer, '*').. 
1780: 20 20 20 65 78 70 65 63 74 28 73 75 62 54 61 67     expect(subTag
1790: 73 2e 6c 65 6e 67 74 68 29 2e 74 6f 2e 62 65 2e  s.length).to.be.
17a0: 65 71 75 61 6c 28 33 29 0a 0a 20 20 20 20 73 75  equal(3)..    su
17b0: 62 54 61 67 73 2e 66 6f 72 45 61 63 68 28 74 61  bTags.forEach(ta
17c0: 67 20 3d 3e 20 74 61 67 2e 75 6e 6d 6f 75 6e 74  g => tag.unmount
17d0: 28 29 29 0a 20 20 20 20 63 6f 6e 74 61 69 6e 65  ()).    containe
17e0: 72 2e 70 61 72 65 6e 74 4e 6f 64 65 2e 72 65 6d  r.parentNode.rem
17f0: 6f 76 65 43 68 69 6c 64 28 63 6f 6e 74 61 69 6e  oveChild(contain
1800: 65 72 29 0a 20 20 7d 29 0a 0a 20 20 69 74 28 27  er).  })..  it('
1810: 61 76 6f 69 64 20 74 6f 20 6d 6f 75 6e 74 20 75  avoid to mount u
1820: 6e 72 65 67 69 73 74 65 72 65 64 20 74 61 67 73  nregistered tags
1830: 27 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a  ', function() {.
1840: 20 20 20 20 69 6e 6a 65 63 74 48 54 4d 4c 28 27      injectHTML('
1850: 3c 72 69 6f 74 2d 74 6d 70 3e 3c 2f 72 69 6f 74  <riot-tmp></riot
1860: 2d 74 6d 70 3e 27 29 0a 0a 20 20 20 20 72 69 6f  -tmp>')..    rio
1870: 74 2e 74 61 67 28 27 72 69 6f 74 2d 74 6d 70 27  t.tag('riot-tmp'
1880: 2c 20 27 3c 70 3e 68 65 6c 6c 6f 3c 2f 70 3e 27  , '<p>hello</p>'
1890: 29 0a 20 20 20 20 72 69 6f 74 2e 75 6e 72 65 67  ).    riot.unreg
18a0: 69 73 74 65 72 28 27 72 69 6f 74 2d 74 6d 70 27  ister('riot-tmp'
18b0: 29 0a 0a 20 20 20 20 63 6f 6e 73 74 20 74 61 67  )..    const tag
18c0: 73 20 3d 20 72 69 6f 74 2e 6d 6f 75 6e 74 28 27  s = riot.mount('
18d0: 2a 27 29 0a 0a 20 20 20 20 65 78 70 65 63 74 28  *')..    expect(
18e0: 74 61 67 73 29 2e 74 6f 2e 62 65 2e 68 61 76 65  tags).to.be.have
18f0: 2e 6c 65 6e 67 74 68 28 30 29 0a 0a 20 20 20 20  .length(0)..    
1900: 63 6f 6e 73 74 20 6e 6f 64 65 20 3d 20 24 28 27  const node = $('
1910: 72 69 6f 74 2d 74 6d 70 27 29 0a 0a 20 20 20 20  riot-tmp')..    
1920: 6e 6f 64 65 2e 70 61 72 65 6e 74 4e 6f 64 65 2e  node.parentNode.
1930: 72 65 6d 6f 76 65 43 68 69 6c 64 28 6e 6f 64 65  removeChild(node
1940: 29 0a 20 20 7d 29 0a 0a 20 20 69 74 28 27 72 65  ).  })..  it('re
1950: 6d 6f 76 65 20 73 74 79 6c 65 20 6f 66 20 75 6e  move style of un
1960: 72 65 67 69 73 74 65 72 65 64 20 74 61 67 73 20  registered tags 
1970: 6f 75 74 20 6f 66 20 64 6f 63 75 6d 65 6e 74 27  out of document'
1980: 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20  , function() {. 
1990: 20 20 20 69 6e 6a 65 63 74 48 54 4d 4c 28 27 3c     injectHTML('<
19a0: 72 69 6f 74 2d 74 6d 70 2d 77 69 74 68 2d 73 74  riot-tmp-with-st
19b0: 79 6c 65 3e 3c 2f 72 69 6f 74 2d 74 6d 70 2d 77  yle></riot-tmp-w
19c0: 69 74 68 2d 73 74 79 6c 65 3e 27 29 0a 0a 20 20  ith-style>')..  
19d0: 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 72 69    try {.      ri
19e0: 6f 74 2e 74 61 67 28 27 72 69 6f 74 2d 74 6d 70  ot.tag('riot-tmp
19f0: 2d 77 69 74 68 2d 73 74 79 6c 65 27 2c 20 27 3c  -with-style', '<
1a00: 70 3e 68 65 6c 6c 6f 3c 2f 70 3e 27 2c 20 27 72  p>hello</p>', 'r
1a10: 69 6f 74 2d 74 6d 70 2d 77 69 74 68 2d 73 74 79  iot-tmp-with-sty
1a20: 6c 65 20 7b 20 66 6f 6e 74 2d 73 69 7a 65 3a 20  le { font-size: 
1a30: 31 72 65 6d 3b 20 7d 27 29 0a 0a 20 20 20 20 20  1rem; }')..     
1a40: 20 72 69 6f 74 2e 6d 6f 75 6e 74 28 27 2a 27 29   riot.mount('*')
1a50: 20 2f 2f 20 65 6e 73 75 72 65 20 3c 73 74 79 6c   // ensure <styl
1a60: 65 3e 20 75 70 64 61 74 65 64 0a 0a 20 20 20 20  e> updated..    
1a70: 20 20 72 69 6f 74 2e 75 6e 72 65 67 69 73 74 65    riot.unregiste
1a80: 72 28 27 72 69 6f 74 2d 74 6d 70 2d 77 69 74 68  r('riot-tmp-with
1a90: 2d 73 74 79 6c 65 27 29 0a 0a 20 20 20 20 20 20  -style')..      
1aa0: 72 69 6f 74 2e 6d 6f 75 6e 74 28 27 2a 27 29 20  riot.mount('*') 
1ab0: 2f 2f 20 65 6e 73 75 72 65 20 3c 73 74 79 6c 65  // ensure <style
1ac0: 3e 20 75 70 64 61 74 65 64 0a 0a 20 20 20 20 20  > updated..     
1ad0: 20 24 24 28 27 68 65 61 64 20 73 74 79 6c 65 27   $$('head style'
1ae0: 29 2e 66 6f 72 45 61 63 68 28 73 74 79 6c 65 20  ).forEach(style 
1af0: 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 65 78 70  => {.        exp
1b00: 65 63 74 28 73 74 79 6c 65 2e 74 65 78 74 43 6f  ect(style.textCo
1b10: 6e 74 65 6e 74 29 2e 6e 6f 74 2e 74 6f 2e 63 6f  ntent).not.to.co
1b20: 6e 74 61 69 6e 28 27 72 69 6f 74 2d 74 6d 70 2d  ntain('riot-tmp-
1b30: 77 69 74 68 2d 73 74 79 6c 65 27 29 0a 20 20 20  with-style').   
1b40: 20 20 20 7d 29 0a 20 20 20 20 7d 20 66 69 6e 61     }).    } fina
1b50: 6c 6c 79 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73  lly {.      cons
1b60: 74 20 6e 6f 64 65 20 3d 20 24 28 27 72 69 6f 74  t node = $('riot
1b70: 2d 74 6d 70 2d 77 69 74 68 2d 73 74 79 6c 65 27  -tmp-with-style'
1b80: 29 0a 20 20 20 20 20 20 6e 6f 64 65 2e 70 61 72  ).      node.par
1b90: 65 6e 74 4e 6f 64 65 2e 72 65 6d 6f 76 65 43 68  entNode.removeCh
1ba0: 69 6c 64 28 6e 6f 64 65 29 0a 20 20 20 20 7d 0a  ild(node).    }.
1bb0: 20 20 7d 29 0a 0a 20 20 69 74 28 27 61 6e 20 3c    })..  it('an <
1bc0: 6f 70 74 69 6f 6e 3e 20 74 61 67 20 68 61 76 69  option> tag havi
1bd0: 6e 67 20 74 68 65 20 61 74 74 72 69 62 75 74 65  ng the attribute
1be0: 20 22 73 65 6c 65 63 74 65 64 22 20 73 68 6f 75   "selected" shou
1bf0: 6c 64 20 62 65 20 74 68 65 20 76 61 6c 75 65 20  ld be the value 
1c00: 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 3c 73  of the parent <s
1c10: 65 6c 65 63 74 3e 20 74 61 67 27 2c 20 66 75 6e  elect> tag', fun
1c20: 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20 69 6e  ction() {.    in
1c30: 6a 65 63 74 48 54 4d 4c 28 27 3c 74 6d 70 2d 73  jectHTML('<tmp-s
1c40: 65 6c 65 63 74 2d 74 61 67 3e 3c 2f 74 6d 70 2d  elect-tag></tmp-
1c50: 73 65 6c 65 63 74 2d 74 61 67 3e 27 29 0a 0a 20  select-tag>').. 
1c60: 20 20 20 72 69 6f 74 2e 74 61 67 28 27 74 6d 70     riot.tag('tmp
1c70: 2d 73 65 6c 65 63 74 2d 74 61 67 27 2c 20 60 0a  -select-tag', `.
1c80: 20 20 20 20 3c 73 65 6c 65 63 74 20 72 65 66 3d      <select ref=
1c90: 27 73 65 6c 65 63 74 27 3e 0a 20 20 20 20 20 20  'select'>.      
1ca0: 3c 6f 70 74 69 6f 6e 20 76 61 6c 75 65 3d 22 31  <option value="1
1cb0: 22 20 73 65 6c 65 63 74 65 64 3d 22 7b 76 20 3d  " selected="{v =
1cc0: 3d 20 31 7d 22 3e 31 3c 2f 6f 70 74 69 6f 6e 3e  = 1}">1</option>
1cd0: 0a 20 20 20 20 20 20 3c 6f 70 74 69 6f 6e 20 76  .      <option v
1ce0: 61 6c 75 65 3d 22 32 22 20 73 65 6c 65 63 74 65  alue="2" selecte
1cf0: 64 3d 22 7b 76 20 3d 3d 20 32 7d 22 3e 32 3c 2f  d="{v == 2}">2</
1d00: 6f 70 74 69 6f 6e 3e 0a 20 20 20 20 20 20 3c 6f  option>.      <o
1d10: 70 74 69 6f 6e 20 76 61 6c 75 65 3d 22 33 22 20  ption value="3" 
1d20: 73 65 6c 65 63 74 65 64 3d 22 7b 76 20 3d 3d 20  selected="{v == 
1d30: 33 7d 22 3e 33 3c 2f 6f 70 74 69 6f 6e 3e 0a 20  3}">3</option>. 
1d40: 20 20 20 3c 2f 73 65 6c 65 63 74 3e 60 2c 0a 20     </select>`,. 
1d50: 20 20 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a     function() {.
1d60: 20 20 20 20 20 20 74 68 69 73 2e 76 20 3d 20 32        this.v = 2
1d70: 0a 20 20 20 20 7d 29 0a 0a 20 20 20 20 76 61 72  .    })..    var
1d80: 20 74 61 67 20 3d 20 72 69 6f 74 2e 6d 6f 75 6e   tag = riot.moun
1d90: 74 28 27 74 6d 70 2d 73 65 6c 65 63 74 2d 74 61  t('tmp-select-ta
1da0: 67 27 29 5b 30 5d 0a 0a 20 20 20 20 65 78 70 65  g')[0]..    expe
1db0: 63 74 28 74 61 67 2e 72 65 66 73 2e 73 65 6c 65  ct(tag.refs.sele
1dc0: 63 74 2e 73 65 6c 65 63 74 65 64 49 6e 64 65 78  ct.selectedIndex
1dd0: 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 31 29  ).to.be.equal(1)
1de0: 0a 0a 20 20 20 20 74 61 67 2e 75 6e 6d 6f 75 6e  ..    tag.unmoun
1df0: 74 28 29 0a 20 20 20 20 72 69 6f 74 2e 75 6e 72  t().    riot.unr
1e00: 65 67 69 73 74 65 72 28 27 74 6d 70 2d 73 65 6c  egister('tmp-sel
1e10: 65 63 74 2d 74 61 67 27 29 0a 20 20 7d 29 0a 0a  ect-tag').  })..
1e20: 20 20 69 74 28 27 74 68 65 20 6d 6f 75 6e 74 20    it('the mount 
1e30: 6d 65 74 68 6f 64 20 63 6f 75 6c 64 20 62 65 20  method could be 
1e40: 74 72 69 67 67 65 72 65 64 20 61 6c 73 6f 20 6f  triggered also o
1e50: 6e 20 73 65 76 65 72 61 6c 20 74 61 67 73 20 75  n several tags u
1e60: 73 69 6e 67 20 61 20 4e 6f 64 65 4c 69 73 74 20  sing a NodeList 
1e70: 69 6e 73 74 61 6e 63 65 27 2c 20 66 75 6e 63 74  instance', funct
1e80: 69 6f 6e 28 29 20 7b 0a 0a 20 20 20 20 69 6e 6a  ion() {..    inj
1e90: 65 63 74 48 54 4d 4c 28 5b 0a 20 20 20 20 20 20  ectHTML([.      
1ea0: 27 3c 6d 75 6c 74 69 2d 6d 6f 75 6e 74 20 76 61  '<multi-mount va
1eb0: 6c 75 65 3d 22 31 22 3e 3c 2f 6d 75 6c 74 69 2d  lue="1"></multi-
1ec0: 6d 6f 75 6e 74 3e 27 2c 0a 20 20 20 20 20 20 27  mount>',.      '
1ed0: 3c 6d 75 6c 74 69 2d 6d 6f 75 6e 74 20 76 61 6c  <multi-mount val
1ee0: 75 65 3d 22 32 22 3e 3c 2f 6d 75 6c 74 69 2d 6d  ue="2"></multi-m
1ef0: 6f 75 6e 74 3e 27 2c 0a 20 20 20 20 20 20 27 3c  ount>',.      '<
1f00: 6d 75 6c 74 69 2d 6d 6f 75 6e 74 20 76 61 6c 75  multi-mount valu
1f10: 65 3d 22 33 22 3e 3c 2f 6d 75 6c 74 69 2d 6d 6f  e="3"></multi-mo
1f20: 75 6e 74 3e 27 2c 0a 20 20 20 20 20 20 27 3c 6d  unt>',.      '<m
1f30: 75 6c 74 69 2d 6d 6f 75 6e 74 20 76 61 6c 75 65  ulti-mount value
1f40: 3d 22 34 22 3e 3c 2f 6d 75 6c 74 69 2d 6d 6f 75  ="4"></multi-mou
1f50: 6e 74 3e 27 0a 20 20 20 20 5d 29 0a 0a 20 20 20  nt>'.    ])..   
1f60: 20 72 69 6f 74 2e 74 61 67 28 27 6d 75 6c 74 69   riot.tag('multi
1f70: 2d 6d 6f 75 6e 74 27 2c 20 27 7b 20 6f 70 74 73  -mount', '{ opts
1f80: 2e 76 61 6c 75 65 20 7d 27 29 0a 0a 20 20 20 20  .value }')..    
1f90: 76 61 72 20 6d 75 6c 74 69 70 6c 65 54 61 67 73  var multipleTags
1fa0: 20 3d 20 72 69 6f 74 2e 6d 6f 75 6e 74 28 24 24   = riot.mount($$
1fb0: 28 27 6d 75 6c 74 69 2d 6d 6f 75 6e 74 27 29 29  ('multi-mount'))
1fc0: 0a 0a 20 20 20 20 65 78 70 65 63 74 28 6d 75 6c  ..    expect(mul
1fd0: 74 69 70 6c 65 54 61 67 73 5b 30 5d 2e 72 6f 6f  tipleTags[0].roo
1fe0: 74 2e 69 6e 6e 65 72 48 54 4d 4c 29 2e 74 6f 2e  t.innerHTML).to.
1ff0: 62 65 2e 65 71 75 61 6c 28 27 31 27 29 0a 20 20  be.equal('1').  
2000: 20 20 65 78 70 65 63 74 28 6d 75 6c 74 69 70 6c    expect(multipl
2010: 65 54 61 67 73 5b 31 5d 2e 72 6f 6f 74 2e 69 6e  eTags[1].root.in
2020: 6e 65 72 48 54 4d 4c 29 2e 74 6f 2e 62 65 2e 65  nerHTML).to.be.e
2030: 71 75 61 6c 28 27 32 27 29 0a 20 20 20 20 65 78  qual('2').    ex
2040: 70 65 63 74 28 6d 75 6c 74 69 70 6c 65 54 61 67  pect(multipleTag
2050: 73 5b 32 5d 2e 72 6f 6f 74 2e 69 6e 6e 65 72 48  s[2].root.innerH
2060: 54 4d 4c 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c  TML).to.be.equal
2070: 28 27 33 27 29 0a 20 20 20 20 65 78 70 65 63 74  ('3').    expect
2080: 28 6d 75 6c 74 69 70 6c 65 54 61 67 73 5b 33 5d  (multipleTags[3]
2090: 2e 72 6f 6f 74 2e 69 6e 6e 65 72 48 54 4d 4c 29  .root.innerHTML)
20a0: 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27 34 27  .to.be.equal('4'
20b0: 29 0a 0a 20 20 20 20 6d 75 6c 74 69 70 6c 65 54  )..    multipleT
20c0: 61 67 73 2e 66 6f 72 45 61 63 68 28 74 61 67 20  ags.forEach(tag 
20d0: 3d 3e 20 74 61 67 2e 75 6e 6d 6f 75 6e 74 28 29  => tag.unmount()
20e0: 29 0a 20 20 7d 29 0a 0a 0a 20 20 69 74 28 27 61  ).  })...  it('a
20f0: 6c 6c 20 74 68 65 20 6e 65 73 74 65 64 20 74 61  ll the nested ta
2100: 67 73 20 77 69 6c 6c 20 61 72 65 20 63 6f 72 72  gs will are corr
2110: 65 63 74 6c 79 20 70 75 73 68 65 64 20 74 6f 20  ectly pushed to 
2120: 74 68 65 20 70 61 72 65 6e 74 2e 74 61 67 73 20  the parent.tags 
2130: 70 72 6f 70 65 72 74 79 27 2c 20 66 75 6e 63 74  property', funct
2140: 69 6f 6e 28 29 20 7b 0a 0a 20 20 20 20 69 6e 6a  ion() {..    inj
2150: 65 63 74 48 54 4d 4c 28 27 3c 6e 65 73 74 65 64  ectHTML('<nested
2160: 2d 63 68 69 6c 64 3e 3c 2f 6e 65 73 74 65 64 2d  -child></nested-
2170: 63 68 69 6c 64 3e 27 29 0a 0a 20 20 20 20 76 61  child>')..    va
2180: 72 20 74 61 67 20 3d 20 72 69 6f 74 2e 6d 6f 75  r tag = riot.mou
2190: 6e 74 28 27 6e 65 73 74 65 64 2d 63 68 69 6c 64  nt('nested-child
21a0: 27 29 5b 30 5d 0a 0a 20 20 20 20 65 78 70 65 63  ')[0]..    expec
21b0: 74 28 74 61 67 2e 74 61 67 73 2e 63 68 69 6c 64  t(tag.tags.child
21c0: 2e 6c 65 6e 67 74 68 29 2e 74 6f 2e 62 65 2e 65  .length).to.be.e
21d0: 71 75 61 6c 28 36 29 0a 20 20 20 20 65 78 70 65  qual(6).    expe
21e0: 63 74 28 74 61 67 2e 74 61 67 73 5b 27 61 6e 6f  ct(tag.tags['ano
21f0: 74 68 65 72 2d 6e 65 73 74 65 64 2d 63 68 69 6c  ther-nested-chil
2200: 64 27 5d 29 2e 74 6f 2e 62 65 2e 61 6e 28 27 6f  d']).to.be.an('o
2210: 62 6a 65 63 74 27 29 0a 20 20 20 20 74 61 67 2e  bject').    tag.
2220: 74 61 67 73 2e 63 68 69 6c 64 5b 30 5d 2e 75 6e  tags.child[0].un
2230: 6d 6f 75 6e 74 28 29 0a 20 20 20 20 65 78 70 65  mount().    expe
2240: 63 74 28 74 61 67 2e 74 61 67 73 2e 63 68 69 6c  ct(tag.tags.chil
2250: 64 2e 6c 65 6e 67 74 68 29 2e 74 6f 2e 62 65 2e  d.length).to.be.
2260: 65 71 75 61 6c 28 35 29 0a 20 20 20 20 74 61 67  equal(5).    tag
2270: 2e 74 61 67 73 5b 27 61 6e 6f 74 68 65 72 2d 6e  .tags['another-n
2280: 65 73 74 65 64 2d 63 68 69 6c 64 27 5d 2e 75 6e  ested-child'].un
2290: 6d 6f 75 6e 74 28 29 0a 20 20 20 20 65 78 70 65  mount().    expe
22a0: 63 74 28 74 61 67 2e 74 61 67 73 5b 27 61 6e 6f  ct(tag.tags['ano
22b0: 74 68 65 72 2d 6e 65 73 74 65 64 2d 63 68 69 6c  ther-nested-chil
22c0: 64 27 5d 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c  d']).to.be.equal
22d0: 28 75 6e 64 65 66 69 6e 65 64 29 0a 0a 20 20 20  (undefined)..   
22e0: 20 74 61 67 2e 75 6e 6d 6f 75 6e 74 28 29 0a 0a   tag.unmount()..
22f0: 20 20 7d 29 0a 0a 20 20 69 74 28 27 62 72 61 63    })..  it('brac
2300: 6b 65 74 73 27 2c 20 66 75 6e 63 74 69 6f 6e 28  kets', function(
2310: 29 20 7b 0a 0a 20 20 20 20 69 6e 6a 65 63 74 48  ) {..    injectH
2320: 54 4d 4c 28 5b 0a 20 20 20 20 20 20 27 3c 74 65  TML([.      '<te
2330: 73 74 2d 61 3e 3c 2f 74 65 73 74 2d 61 3e 27 2c  st-a></test-a>',
2340: 0a 20 20 20 20 20 20 27 3c 74 65 73 74 2d 62 3e  .      '<test-b>
2350: 3c 2f 74 65 73 74 2d 62 3e 27 2c 0a 20 20 20 20  </test-b>',.    
2360: 20 20 27 3c 74 65 73 74 2d 63 3e 3c 2f 74 65 73    '<test-c></tes
2370: 74 2d 63 3e 27 2c 0a 20 20 20 20 20 20 27 3c 74  t-c>',.      '<t
2380: 65 73 74 2d 64 3e 3c 2f 74 65 73 74 2d 64 3e 27  est-d></test-d>'
2390: 2c 0a 20 20 20 20 20 20 27 3c 74 65 73 74 2d 65  ,.      '<test-e
23a0: 3e 3c 2f 74 65 73 74 2d 65 3e 27 2c 0a 20 20 20  ></test-e>',.   
23b0: 20 20 20 27 3c 74 65 73 74 2d 66 3e 3c 2f 74 65     '<test-f></te
23c0: 73 74 2d 66 3e 27 2c 0a 20 20 20 20 20 20 27 3c  st-f>',.      '<
23d0: 74 65 73 74 2d 67 3e 3c 2f 74 65 73 74 2d 67 3e  test-g></test-g>
23e0: 27 0a 20 20 20 20 5d 29 0a 0a 20 20 20 20 76 61  '.    ])..    va
23f0: 72 20 74 61 67 0a 0a 20 20 20 20 72 69 6f 74 2e  r tag..    riot.
2400: 73 65 74 74 69 6e 67 73 2e 62 72 61 63 6b 65 74  settings.bracket
2410: 73 20 3d 20 27 5b 20 5d 27 0a 20 20 20 20 72 69  s = '[ ]'.    ri
2420: 6f 74 2e 74 61 67 28 27 74 65 73 74 2d 61 27 2c  ot.tag('test-a',
2430: 20 27 3c 70 3e 5b 20 78 20 5d 3c 2f 70 3e 27 2c   '<p>[ x ]</p>',
2440: 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 20 74 68   function() { th
2450: 69 73 2e 78 20 3d 20 27 6f 6b 27 7d 29 0a 20 20  is.x = 'ok'}).  
2460: 20 20 74 61 67 20 3d 20 72 69 6f 74 2e 6d 6f 75    tag = riot.mou
2470: 6e 74 28 27 74 65 73 74 2d 61 27 29 5b 30 5d 0a  nt('test-a')[0].
2480: 20 20 20 20 65 78 70 65 63 74 28 6e 6f 72 6d 61      expect(norma
2490: 6c 69 7a 65 48 54 4d 4c 28 74 61 67 2e 72 6f 6f  lizeHTML(tag.roo
24a0: 74 2e 69 6e 6e 65 72 48 54 4d 4c 29 29 2e 74 6f  t.innerHTML)).to
24b0: 2e 62 65 2e 65 71 75 61 6c 28 27 3c 70 3e 6f 6b  .be.equal('<p>ok
24c0: 3c 2f 70 3e 27 29 0a 20 20 20 20 74 61 67 2e 75  </p>').    tag.u
24d0: 6e 6d 6f 75 6e 74 28 29 0a 0a 20 20 20 20 72 69  nmount()..    ri
24e0: 6f 74 2e 73 65 74 74 69 6e 67 73 2e 62 72 61 63  ot.settings.brac
24f0: 6b 65 74 73 20 3d 20 27 24 7b 20 7d 27 0a 20 20  kets = '${ }'.  
2500: 20 20 72 69 6f 74 2e 74 61 67 28 27 74 65 73 74    riot.tag('test
2510: 2d 63 27 2c 20 27 3c 70 3e 24 7b 20 78 20 7d 3c  -c', '<p>${ x }<
2520: 2f 70 3e 27 2c 20 66 75 6e 63 74 69 6f 6e 28 29  /p>', function()
2530: 20 7b 20 74 68 69 73 2e 78 20 3d 20 27 6f 6b 27   { this.x = 'ok'
2540: 20 7d 29 0a 20 20 20 20 74 61 67 20 3d 20 72 69   }).    tag = ri
2550: 6f 74 2e 6d 6f 75 6e 74 28 27 74 65 73 74 2d 63  ot.mount('test-c
2560: 27 29 5b 30 5d 0a 0a 20 20 20 20 65 78 70 65 63  ')[0]..    expec
2570: 74 28 6e 6f 72 6d 61 6c 69 7a 65 48 54 4d 4c 28  t(normalizeHTML(
2580: 74 61 67 2e 72 6f 6f 74 2e 69 6e 6e 65 72 48 54  tag.root.innerHT
2590: 4d 4c 29 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c  ML)).to.be.equal
25a0: 28 27 3c 70 3e 6f 6b 3c 2f 70 3e 27 29 0a 20 20  ('<p>ok</p>').  
25b0: 20 20 74 61 67 2e 75 6e 6d 6f 75 6e 74 28 29 0a    tag.unmount().
25c0: 0a 20 20 20 20 72 69 6f 74 2e 73 65 74 74 69 6e  .    riot.settin
25d0: 67 73 2e 62 72 61 63 6b 65 74 73 20 3d 20 6e 75  gs.brackets = nu
25e0: 6c 6c 0a 20 20 20 20 72 69 6f 74 2e 74 61 67 28  ll.    riot.tag(
25f0: 27 74 65 73 74 2d 64 27 2c 20 27 3c 70 3e 7b 20  'test-d', '<p>{ 
2600: 78 20 7d 3c 2f 70 3e 27 2c 20 66 75 6e 63 74 69  x }</p>', functi
2610: 6f 6e 28 29 20 7b 20 74 68 69 73 2e 78 20 3d 20  on() { this.x = 
2620: 27 6f 6b 27 20 7d 29 0a 20 20 20 20 74 61 67 20  'ok' }).    tag 
2630: 3d 20 72 69 6f 74 2e 6d 6f 75 6e 74 28 27 74 65  = riot.mount('te
2640: 73 74 2d 64 27 29 5b 30 5d 0a 0a 20 20 20 20 65  st-d')[0]..    e
2650: 78 70 65 63 74 28 6e 6f 72 6d 61 6c 69 7a 65 48  xpect(normalizeH
2660: 54 4d 4c 28 74 61 67 2e 72 6f 6f 74 2e 69 6e 6e  TML(tag.root.inn
2670: 65 72 48 54 4d 4c 29 29 2e 74 6f 2e 62 65 2e 65  erHTML)).to.be.e
2680: 71 75 61 6c 28 27 3c 70 3e 6f 6b 3c 2f 70 3e 27  qual('<p>ok</p>'
2690: 29 0a 20 20 20 20 74 61 67 2e 75 6e 6d 6f 75 6e  ).    tag.unmoun
26a0: 74 28 29 0a 0a 20 20 20 20 72 69 6f 74 2e 73 65  t()..    riot.se
26b0: 74 74 69 6e 67 73 2e 62 72 61 63 6b 65 74 73 20  ttings.brackets 
26c0: 3d 20 27 5b 20 5d 27 0a 20 20 20 20 72 69 6f 74  = '[ ]'.    riot
26d0: 2e 74 61 67 28 27 74 65 73 74 2d 65 27 2c 20 27  .tag('test-e', '
26e0: 3c 70 3e 5b 20 78 20 5d 3c 2f 70 3e 27 2c 20 66  <p>[ x ]</p>', f
26f0: 75 6e 63 74 69 6f 6e 28 29 20 7b 20 74 68 69 73  unction() { this
2700: 2e 78 20 3d 20 27 6f 6b 27 20 7d 29 0a 20 20 20  .x = 'ok' }).   
2710: 20 74 61 67 20 3d 20 72 69 6f 74 2e 6d 6f 75 6e   tag = riot.moun
2720: 74 28 27 74 65 73 74 2d 65 27 29 5b 30 5d 0a 0a  t('test-e')[0]..
2730: 20 20 20 20 65 78 70 65 63 74 28 6e 6f 72 6d 61      expect(norma
2740: 6c 69 7a 65 48 54 4d 4c 28 74 61 67 2e 72 6f 6f  lizeHTML(tag.roo
2750: 74 2e 69 6e 6e 65 72 48 54 4d 4c 29 29 2e 74 6f  t.innerHTML)).to
2760: 2e 62 65 2e 65 71 75 61 6c 28 27 3c 70 3e 6f 6b  .be.equal('<p>ok
2770: 3c 2f 70 3e 27 29 0a 20 20 20 20 74 61 67 2e 75  </p>').    tag.u
2780: 6e 6d 6f 75 6e 74 28 29 0a 0a 20 20 20 20 72 69  nmount()..    ri
2790: 6f 74 2e 73 65 74 74 69 6e 67 73 2e 62 72 61 63  ot.settings.brac
27a0: 6b 65 74 73 20 3d 20 27 24 7b 20 7d 27 0a 20 20  kets = '${ }'.  
27b0: 20 20 72 69 6f 74 2e 74 61 67 28 27 74 65 73 74    riot.tag('test
27c0: 2d 66 27 2c 20 27 3c 70 3e 24 7b 20 78 20 7d 3c  -f', '<p>${ x }<
27d0: 2f 70 3e 27 2c 20 66 75 6e 63 74 69 6f 6e 28 29  /p>', function()
27e0: 20 7b 20 74 68 69 73 2e 78 20 3d 20 27 6f 6b 27   { this.x = 'ok'
27f0: 20 7d 29 0a 20 20 20 20 74 61 67 20 3d 20 72 69   }).    tag = ri
2800: 6f 74 2e 6d 6f 75 6e 74 28 27 74 65 73 74 2d 66  ot.mount('test-f
2810: 27 29 5b 30 5d 0a 0a 20 20 20 20 65 78 70 65 63  ')[0]..    expec
2820: 74 28 6e 6f 72 6d 61 6c 69 7a 65 48 54 4d 4c 28  t(normalizeHTML(
2830: 74 61 67 2e 72 6f 6f 74 2e 69 6e 6e 65 72 48 54  tag.root.innerHT
2840: 4d 4c 29 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c  ML)).to.be.equal
2850: 28 27 3c 70 3e 6f 6b 3c 2f 70 3e 27 29 0a 20 20  ('<p>ok</p>').  
2860: 20 20 74 61 67 2e 75 6e 6d 6f 75 6e 74 28 29 0a    tag.unmount().
2870: 0a 20 20 20 20 72 69 6f 74 2e 73 65 74 74 69 6e  .    riot.settin
2880: 67 73 2e 62 72 61 63 6b 65 74 73 20 3d 20 6e 75  gs.brackets = nu
2890: 6c 6c 0a 20 20 20 20 72 69 6f 74 2e 74 61 67 28  ll.    riot.tag(
28a0: 27 74 65 73 74 2d 67 27 2c 20 27 3c 70 3e 7b 20  'test-g', '<p>{ 
28b0: 78 20 7d 3c 2f 70 3e 27 2c 20 66 75 6e 63 74 69  x }</p>', functi
28c0: 6f 6e 28 29 20 7b 20 74 68 69 73 2e 78 20 3d 20  on() { this.x = 
28d0: 27 6f 6b 27 20 7d 29 0a 20 20 20 20 74 61 67 20  'ok' }).    tag 
28e0: 3d 20 72 69 6f 74 2e 6d 6f 75 6e 74 28 27 74 65  = riot.mount('te
28f0: 73 74 2d 67 27 29 5b 30 5d 0a 0a 20 20 20 20 65  st-g')[0]..    e
2900: 78 70 65 63 74 28 6e 6f 72 6d 61 6c 69 7a 65 48  xpect(normalizeH
2910: 54 4d 4c 28 74 61 67 2e 72 6f 6f 74 2e 69 6e 6e  TML(tag.root.inn
2920: 65 72 48 54 4d 4c 29 29 2e 74 6f 2e 62 65 2e 65  erHTML)).to.be.e
2930: 71 75 61 6c 28 27 3c 70 3e 6f 6b 3c 2f 70 3e 27  qual('<p>ok</p>'
2940: 29 0a 20 20 20 20 74 61 67 2e 75 6e 6d 6f 75 6e  ).    tag.unmoun
2950: 74 28 29 0a 0a 20 20 7d 29 0a 0a 20 20 69 74 28  t()..  })..  it(
2960: 27 74 68 65 20 63 61 73 65 20 6f 66 20 61 74 74  'the case of att
2970: 72 69 62 75 74 65 73 20 70 72 65 66 69 78 65 64  ributes prefixed
2980: 20 77 69 74 68 20 72 69 6f 74 20 73 68 6f 75 6c   with riot shoul
2990: 64 20 62 65 20 6c 65 61 76 65 64 20 75 6e 74 6f  d be leaved unto
29a0: 75 63 68 65 64 27 2c 20 66 75 6e 63 74 69 6f 6e  uched', function
29b0: 28 29 20 7b 0a 20 20 20 20 72 69 6f 74 2e 74 61  () {.    riot.ta
29c0: 67 28 27 63 72 61 7a 79 2d 73 76 67 27 2c 20 60  g('crazy-svg', `
29d0: 0a 20 20 20 20 20 20 3c 73 76 67 20 70 72 65 73  .      <svg pres
29e0: 65 72 76 65 41 73 70 65 63 74 52 61 74 69 6f 3d  erveAspectRatio=
29f0: 22 78 4d 69 6e 59 4d 61 78 20 6d 65 65 74 22 20  "xMinYMax meet" 
2a00: 72 69 6f 74 2d 76 69 65 77 42 6f 78 3d 22 7b 27  riot-viewBox="{'
2a10: 30 20 30 20 33 30 30 20 33 30 30 27 7d 22 3e 0a  0 0 300 300'}">.
2a20: 20 20 20 20 20 20 20 20 3c 63 69 72 63 6c 65 20          <circle 
2a30: 72 69 6f 74 2d 63 78 3d 22 7b 20 35 20 7d 22 20  riot-cx="{ 5 }" 
2a40: 72 69 6f 74 2d 63 79 3d 22 7b 20 35 20 7d 22 20  riot-cy="{ 5 }" 
2a50: 72 3d 22 32 22 20 66 69 6c 6c 3d 22 62 6c 61 63  r="2" fill="blac
2a60: 6b 22 3e 3c 2f 63 69 72 63 6c 65 3e 0a 20 20 20  k"></circle>.   
2a70: 20 20 20 3c 2f 73 76 67 3e 0a 20 20 20 20 60 29     </svg>.    `)
2a80: 0a 0a 20 20 20 20 69 6e 6a 65 63 74 48 54 4d 4c  ..    injectHTML
2a90: 28 27 3c 63 72 61 7a 79 2d 73 76 67 3e 3c 2f 63  ('<crazy-svg></c
2aa0: 72 61 7a 79 2d 73 76 67 3e 27 29 0a 0a 20 20 20  razy-svg>')..   
2ab0: 20 76 61 72 20 74 61 67 20 3d 20 72 69 6f 74 2e   var tag = riot.
2ac0: 6d 6f 75 6e 74 28 27 63 72 61 7a 79 2d 73 76 67  mount('crazy-svg
2ad0: 27 29 5b 30 5d 0a 0a 20 20 20 20 65 78 70 65 63  ')[0]..    expec
2ae0: 74 28 24 28 27 73 76 67 27 2c 20 74 61 67 2e 72  t($('svg', tag.r
2af0: 6f 6f 74 29 2e 67 65 74 41 74 74 72 69 62 75 74  oot).getAttribut
2b00: 65 28 27 76 69 65 77 42 6f 78 27 29 29 2e 74 6f  e('viewBox')).to
2b10: 2e 62 65 2e 65 71 75 61 6c 28 27 30 20 30 20 33  .be.equal('0 0 3
2b20: 30 30 20 33 30 30 27 29 0a 20 20 20 20 65 78 70  00 300').    exp
2b30: 65 63 74 28 24 28 27 73 76 67 27 2c 20 74 61 67  ect($('svg', tag
2b40: 2e 72 6f 6f 74 29 2e 67 65 74 41 74 74 72 69 62  .root).getAttrib
2b50: 75 74 65 28 27 70 72 65 73 65 72 76 65 41 73 70  ute('preserveAsp
2b60: 65 63 74 52 61 74 69 6f 27 29 29 2e 74 6f 2e 62  ectRatio')).to.b
2b70: 65 2e 65 71 75 61 6c 28 27 78 4d 69 6e 59 4d 61  e.equal('xMinYMa
2b80: 78 20 6d 65 65 74 27 29 0a 0a 20 20 20 20 74 61  x meet')..    ta
2b90: 67 2e 75 6e 6d 6f 75 6e 74 28 29 0a 20 20 7d 29  g.unmount().  })
2ba0: 0a 0a 20 20 69 74 28 27 64 61 74 61 2d 69 73 20  ..  it('data-is 
2bb0: 61 74 74 72 69 62 75 74 65 27 2c 20 66 75 6e 63  attribute', func
2bc0: 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20 69 6e 6a  tion() {.    inj
2bd0: 65 63 74 48 54 4d 4c 28 27 3c 64 69 76 20 69 64  ectHTML('<div id
2be0: 3d 22 72 74 61 67 22 20 64 61 74 61 2d 69 73 3d  ="rtag" data-is=
2bf0: 22 72 74 61 67 22 3e 3c 2f 64 69 76 3e 27 29 0a  "rtag"></div>').
2c00: 20 20 20 20 72 69 6f 74 2e 74 61 67 28 27 72 74      riot.tag('rt
2c10: 61 67 27 2c 20 27 3c 70 3e 76 61 6c 3a 20 7b 20  ag', '<p>val: { 
2c20: 6f 70 74 73 2e 76 61 6c 20 7d 3c 2f 70 3e 27 29  opts.val }</p>')
2c30: 0a 0a 20 20 20 20 76 61 72 20 74 61 67 20 3d 20  ..    var tag = 
2c40: 72 69 6f 74 2e 6d 6f 75 6e 74 28 27 23 72 74 61  riot.mount('#rta
2c50: 67 27 2c 20 7b 20 76 61 6c 3a 20 31 30 20 7d 29  g', { val: 10 })
2c60: 5b 30 5d 0a 20 20 20 20 65 78 70 65 63 74 28 6e  [0].    expect(n
2c70: 6f 72 6d 61 6c 69 7a 65 48 54 4d 4c 28 74 61 67  ormalizeHTML(tag
2c80: 2e 72 6f 6f 74 2e 69 6e 6e 65 72 48 54 4d 4c 29  .root.innerHTML)
2c90: 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27 3c  ).to.be.equal('<
2ca0: 70 3e 76 61 6c 3a 20 31 30 3c 2f 70 3e 27 29 0a  p>val: 10</p>').
2cb0: 0a 20 20 20 20 74 61 67 2e 75 6e 6d 6f 75 6e 74  .    tag.unmount
2cc0: 28 29 0a 20 20 20 20 65 78 70 65 63 74 28 24 24  ().    expect($$
2cd0: 28 27 72 74 61 67 27 29 2e 6c 65 6e 67 74 68 29  ('rtag').length)
2ce0: 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 30 29 0a  .to.be.equal(0).
2cf0: 0a 20 20 20 20 74 61 67 2e 75 6e 6d 6f 75 6e 74  .    tag.unmount
2d00: 28 29 0a 20 20 7d 29 0a 0a 20 20 69 74 28 27 74  ().  })..  it('t
2d10: 68 65 20 64 61 74 61 2d 69 73 20 61 74 74 72 69  he data-is attri
2d20: 62 75 74 65 20 69 73 20 70 72 65 73 65 72 76 65  bute is preserve
2d30: 64 20 69 6e 20 63 61 73 65 20 6f 66 20 75 6e 6d  d in case of unm
2d40: 6f 75 6e 74 27 2c 20 66 75 6e 63 74 69 6f 6e 28  ount', function(
2d50: 29 20 7b 0a 20 20 20 20 69 6e 6a 65 63 74 48 54  ) {.    injectHT
2d60: 4d 4c 28 27 3c 64 69 76 20 69 64 3d 22 72 74 61  ML('<div id="rta
2d70: 67 22 20 64 61 74 61 2d 69 73 3d 22 72 74 61 67  g" data-is="rtag
2d80: 22 3e 3c 2f 64 69 76 3e 27 29 0a 20 20 20 20 72  "></div>').    r
2d90: 69 6f 74 2e 74 61 67 28 27 72 74 61 67 27 2c 20  iot.tag('rtag', 
2da0: 27 3c 70 3e 76 61 6c 3a 20 7b 20 6f 70 74 73 2e  '<p>val: { opts.
2db0: 76 61 6c 20 7d 3c 2f 70 3e 27 29 0a 0a 20 20 20  val }</p>')..   
2dc0: 20 76 61 72 20 74 61 67 20 3d 20 72 69 6f 74 2e   var tag = riot.
2dd0: 6d 6f 75 6e 74 28 27 23 72 74 61 67 27 2c 20 7b  mount('#rtag', {
2de0: 20 76 61 6c 3a 20 31 30 20 7d 29 5b 30 5d 0a 20   val: 10 })[0]. 
2df0: 20 20 20 65 78 70 65 63 74 28 6e 6f 72 6d 61 6c     expect(normal
2e00: 69 7a 65 48 54 4d 4c 28 74 61 67 2e 72 6f 6f 74  izeHTML(tag.root
2e10: 2e 69 6e 6e 65 72 48 54 4d 4c 29 29 2e 74 6f 2e  .innerHTML)).to.
2e20: 62 65 2e 65 71 75 61 6c 28 27 3c 70 3e 76 61 6c  be.equal('<p>val
2e30: 3a 20 31 30 3c 2f 70 3e 27 29 0a 0a 20 20 20 20  : 10</p>')..    
2e40: 74 61 67 2e 75 6e 6d 6f 75 6e 74 28 74 72 75 65  tag.unmount(true
2e50: 29 0a 20 20 20 20 65 78 70 65 63 74 28 74 61 67  ).    expect(tag
2e60: 2e 72 6f 6f 74 2e 67 65 74 41 74 74 72 69 62 75  .root.getAttribu
2e70: 74 65 28 27 64 61 74 61 2d 69 73 27 29 29 2e 74  te('data-is')).t
2e80: 6f 2e 62 65 2e 6f 6b 0a 20 20 20 20 74 61 67 2e  o.be.ok.    tag.
2e90: 72 6f 6f 74 2e 70 61 72 65 6e 74 4e 6f 64 65 2e  root.parentNode.
2ea0: 72 65 6d 6f 76 65 43 68 69 6c 64 28 74 61 67 2e  removeChild(tag.
2eb0: 72 6f 6f 74 29 0a 20 20 7d 29 0a 0a 20 20 69 74  root).  })..  it
2ec0: 28 27 64 61 74 61 2d 69 73 20 63 61 6e 20 62 65  ('data-is can be
2ed0: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 63 72 65   dynamically cre
2ee0: 61 74 65 64 20 62 79 20 65 78 70 72 65 73 73 69  ated by expressi
2ef0: 6f 6e 27 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20  on', function() 
2f00: 7b 0a 20 20 20 20 69 6e 6a 65 63 74 48 54 4d 4c  {.    injectHTML
2f10: 28 27 3c 64 79 6e 61 6d 69 63 2d 64 61 74 61 2d  ('<dynamic-data-
2f20: 69 73 3e 3c 2f 64 79 6e 61 6d 69 63 2d 64 61 74  is></dynamic-dat
2f30: 61 2d 69 73 3e 27 29 0a 20 20 20 20 76 61 72 20  a-is>').    var 
2f40: 74 61 67 20 3d 20 72 69 6f 74 2e 6d 6f 75 6e 74  tag = riot.mount
2f50: 28 27 64 79 6e 61 6d 69 63 2d 64 61 74 61 2d 69  ('dynamic-data-i
2f60: 73 27 29 5b 30 5d 0a 20 20 20 20 76 61 72 20 64  s')[0].    var d
2f70: 69 76 73 20 3d 20 24 24 28 27 64 69 76 27 2c 20  ivs = $$('div', 
2f80: 74 61 67 2e 72 6f 6f 74 29 0a 20 20 20 20 65 78  tag.root).    ex
2f90: 70 65 63 74 28 24 28 27 69 6e 70 75 74 27 2c 20  pect($('input', 
2fa0: 64 69 76 73 5b 30 5d 29 2e 67 65 74 41 74 74 72  divs[0]).getAttr
2fb0: 69 62 75 74 65 28 27 74 79 70 65 27 29 29 2e 74  ibute('type')).t
2fc0: 6f 2e 62 65 2e 65 71 75 61 6c 28 27 63 6f 6c 6f  o.be.equal('colo
2fd0: 72 27 29 0a 20 20 20 20 65 78 70 65 63 74 28 24  r').    expect($
2fe0: 28 27 69 6e 70 75 74 27 2c 20 64 69 76 73 5b 30  ('input', divs[0
2ff0: 5d 29 2e 67 65 74 41 74 74 72 69 62 75 74 65 28  ]).getAttribute(
3000: 27 6e 61 6d 65 27 29 29 2e 74 6f 2e 62 65 2e 65  'name')).to.be.e
3010: 71 75 61 6c 28 27 61 61 61 27 29 0a 20 20 20 20  qual('aaa').    
3020: 65 78 70 65 63 74 28 24 28 27 69 6e 70 75 74 27  expect($('input'
3030: 2c 20 64 69 76 73 5b 31 5d 29 2e 67 65 74 41 74  , divs[1]).getAt
3040: 74 72 69 62 75 74 65 28 27 74 79 70 65 27 29 29  tribute('type'))
3050: 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27 63 6f  .to.be.equal('co
3060: 6c 6f 72 27 29 0a 20 20 20 20 65 78 70 65 63 74  lor').    expect
3070: 28 24 28 27 69 6e 70 75 74 27 2c 20 64 69 76 73  ($('input', divs
3080: 5b 32 5d 29 2e 67 65 74 41 74 74 72 69 62 75 74  [2]).getAttribut
3090: 65 28 27 74 79 70 65 27 29 29 2e 74 6f 2e 62 65  e('type')).to.be
30a0: 2e 65 71 75 61 6c 28 27 64 61 74 65 27 29 0a 20  .equal('date'). 
30b0: 20 20 20 65 78 70 65 63 74 28 24 28 27 69 6e 70     expect($('inp
30c0: 75 74 27 2c 20 64 69 76 73 5b 33 5d 29 2e 67 65  ut', divs[3]).ge
30d0: 74 41 74 74 72 69 62 75 74 65 28 27 74 79 70 65  tAttribute('type
30e0: 27 29 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28  ')).to.be.equal(
30f0: 27 64 61 74 65 27 29 0a 20 20 20 20 65 78 70 65  'date').    expe
3100: 63 74 28 24 28 27 69 6e 70 75 74 27 2c 20 64 69  ct($('input', di
3110: 76 73 5b 33 5d 29 2e 67 65 74 41 74 74 72 69 62  vs[3]).getAttrib
3120: 75 74 65 28 27 6e 61 6d 65 27 29 29 2e 74 6f 2e  ute('name')).to.
3130: 62 65 2e 65 71 75 61 6c 28 27 63 61 6c 65 6e 64  be.equal('calend
3140: 61 72 27 29 0a 20 20 20 20 65 78 70 65 63 74 28  ar').    expect(
3150: 74 61 67 2e 74 61 67 73 5b 27 64 79 6e 61 6d 69  tag.tags['dynami
3160: 63 2d 64 61 74 61 2d 74 6f 67 67 6c 65 27 5d 29  c-data-toggle'])
3170: 2e 74 6f 2e 62 65 2e 61 6e 28 27 6f 62 6a 65 63  .to.be.an('objec
3180: 74 27 29 0a 0a 0a 20 20 20 20 74 61 67 2e 73 69  t')...    tag.si
3190: 6e 67 6c 65 20 3d 20 27 63 6f 6c 6f 72 27 0a 20  ngle = 'color'. 
31a0: 20 20 20 74 61 67 2e 74 6f 67 67 6c 65 20 3d 20     tag.toggle = 
31b0: 66 61 6c 73 65 0a 20 20 20 20 74 61 67 2e 69 6e  false.    tag.in
31c0: 74 61 67 73 5b 30 5d 2e 6e 61 6d 65 20 3d 20 27  tags[0].name = '
31d0: 64 64 64 27 0a 20 20 20 20 74 61 67 2e 75 70 64  ddd'.    tag.upd
31e0: 61 74 65 28 29 0a 20 20 20 20 65 78 70 65 63 74  ate().    expect
31f0: 28 24 28 27 69 6e 70 75 74 27 2c 20 64 69 76 73  ($('input', divs
3200: 5b 33 5d 29 2e 67 65 74 41 74 74 72 69 62 75 74  [3]).getAttribut
3210: 65 28 27 74 79 70 65 27 29 29 2e 74 6f 2e 62 65  e('type')).to.be
3220: 2e 65 71 75 61 6c 28 27 63 6f 6c 6f 72 27 29 0a  .equal('color').
3230: 20 20 20 20 65 78 70 65 63 74 28 24 28 27 69 6e      expect($('in
3240: 70 75 74 27 2c 20 64 69 76 73 5b 33 5d 29 2e 67  put', divs[3]).g
3250: 65 74 41 74 74 72 69 62 75 74 65 28 27 6e 61 6d  etAttribute('nam
3260: 65 27 29 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c  e')).to.be.equal
3270: 28 27 63 6f 6c 6f 72 27 29 0a 20 20 20 20 65 78  ('color').    ex
3280: 70 65 63 74 28 74 61 67 2e 74 61 67 73 5b 27 64  pect(tag.tags['d
3290: 79 6e 61 6d 69 63 2d 64 61 74 61 2d 74 6f 67 67  ynamic-data-togg
32a0: 6c 65 27 5d 29 2e 74 6f 2e 62 65 2e 65 71 75 61  le']).to.be.equa
32b0: 6c 28 75 6e 64 65 66 69 6e 65 64 29 0a 20 20 20  l(undefined).   
32c0: 20 65 78 70 65 63 74 28 24 28 27 69 6e 70 75 74   expect($('input
32d0: 27 2c 20 64 69 76 73 5b 30 5d 29 2e 67 65 74 41  ', divs[0]).getA
32e0: 74 74 72 69 62 75 74 65 28 27 6e 61 6d 65 27 29  ttribute('name')
32f0: 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27 64  ).to.be.equal('d
3300: 64 64 27 29 0a 0a 20 20 20 20 74 61 67 2e 69 6e  dd')..    tag.in
3310: 74 61 67 73 2e 72 65 76 65 72 73 65 28 29 0a 20  tags.reverse(). 
3320: 20 20 20 74 61 67 2e 74 6f 67 67 6c 65 20 3d 20     tag.toggle = 
3330: 74 72 75 65 0a 20 20 20 20 74 61 67 2e 75 70 64  true.    tag.upd
3340: 61 74 65 28 29 0a 20 20 20 20 64 69 76 73 20 3d  ate().    divs =
3350: 20 24 24 28 27 64 69 76 27 2c 20 74 61 67 2e 72   $$('div', tag.r
3360: 6f 6f 74 29 0a 20 20 20 20 65 78 70 65 63 74 28  oot).    expect(
3370: 24 28 27 69 6e 70 75 74 27 2c 20 64 69 76 73 5b  $('input', divs[
3380: 30 5d 29 2e 67 65 74 41 74 74 72 69 62 75 74 65  0]).getAttribute
3390: 28 27 74 79 70 65 27 29 29 2e 74 6f 2e 62 65 2e  ('type')).to.be.
33a0: 65 71 75 61 6c 28 27 64 61 74 65 27 29 0a 20 20  equal('date').  
33b0: 20 20 65 78 70 65 63 74 28 24 28 27 69 6e 70 75    expect($('inpu
33c0: 74 27 2c 20 64 69 76 73 5b 31 5d 29 2e 67 65 74  t', divs[1]).get
33d0: 41 74 74 72 69 62 75 74 65 28 27 74 79 70 65 27  Attribute('type'
33e0: 29 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27  )).to.be.equal('
33f0: 63 6f 6c 6f 72 27 29 0a 20 20 20 20 65 78 70 65  color').    expe
3400: 63 74 28 24 28 27 69 6e 70 75 74 27 2c 20 64 69  ct($('input', di
3410: 76 73 5b 32 5d 29 2e 67 65 74 41 74 74 72 69 62  vs[2]).getAttrib
3420: 75 74 65 28 27 74 79 70 65 27 29 29 2e 74 6f 2e  ute('type')).to.
3430: 62 65 2e 65 71 75 61 6c 28 27 63 6f 6c 6f 72 27  be.equal('color'
3440: 29 0a 20 20 20 20 65 78 70 65 63 74 28 74 61 67  ).    expect(tag
3450: 2e 74 61 67 73 5b 27 64 79 6e 61 6d 69 63 2d 64  .tags['dynamic-d
3460: 61 74 61 2d 74 6f 67 67 6c 65 27 5d 29 2e 74 6f  ata-toggle']).to
3470: 2e 62 65 2e 61 6e 28 27 6f 62 6a 65 63 74 27 29  .be.an('object')
3480: 0a 0a 20 20 20 20 74 61 67 2e 69 6e 74 61 67 73  ..    tag.intags
3490: 2e 73 70 6c 69 63 65 28 31 2c 20 31 29 0a 20 20  .splice(1, 1).  
34a0: 20 20 74 61 67 2e 75 70 64 61 74 65 28 29 0a 20    tag.update(). 
34b0: 20 20 20 65 78 70 65 63 74 28 74 61 67 2e 74 61     expect(tag.ta
34c0: 67 73 2e 63 6f 6c 6f 72 2e 6c 65 6e 67 74 68 29  gs.color.length)
34d0: 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 32 29 20  .to.be.equal(2) 
34e0: 2f 2f 20 73 69 6e 67 6c 65 20 2b 20 72 65 6d 61  // single + rema
34f0: 69 6e 69 6e 67 20 6c 6f 6f 70 20 63 6f 6c 6f 72  ining loop color
3500: 0a 20 20 20 20 65 78 70 65 63 74 28 74 61 67 2e  .    expect(tag.
3510: 74 61 67 73 2e 63 61 6c 65 6e 64 61 72 29 2e 74  tags.calendar).t
3520: 6f 2e 62 65 2e 61 6e 28 27 6f 62 6a 65 63 74 27  o.be.an('object'
3530: 29 0a 0a 20 20 20 20 2f 2f 20 62 65 6c 6f 77 20  )..    // below 
3540: 63 68 65 63 6b 73 20 66 6f 72 20 73 74 72 61 79  checks for stray
3550: 73 0a 20 20 20 20 74 61 67 2e 69 6e 74 61 67 73  s.    tag.intags
3560: 2e 72 65 76 65 72 73 65 28 29 0a 20 20 20 20 74  .reverse().    t
3570: 61 67 2e 75 70 64 61 74 65 28 29 0a 20 20 20 20  ag.update().    
3580: 65 78 70 65 63 74 28 74 61 67 2e 74 61 67 73 2e  expect(tag.tags.
3590: 63 6f 6c 6f 72 2e 6c 65 6e 67 74 68 29 2e 74 6f  color.length).to
35a0: 2e 62 65 2e 65 71 75 61 6c 28 32 29 0a 0a 20 20  .be.equal(2)..  
35b0: 20 20 74 61 67 2e 69 6e 74 61 67 73 2e 72 65 76    tag.intags.rev
35c0: 65 72 73 65 28 29 0a 20 20 20 20 74 61 67 2e 75  erse().    tag.u
35d0: 70 64 61 74 65 28 29 0a 20 20 20 20 65 78 70 65  pdate().    expe
35e0: 63 74 28 74 61 67 2e 74 61 67 73 2e 63 6f 6c 6f  ct(tag.tags.colo
35f0: 72 2e 6c 65 6e 67 74 68 29 2e 74 6f 2e 62 65 2e  r.length).to.be.
3600: 65 71 75 61 6c 28 32 29 0a 0a 20 20 20 20 2f 2f  equal(2)..    //
3610: 20 73 69 6e 67 6c 65 20 74 61 67 73 20 61 73 20   single tags as 
3620: 74 61 67 20 6f 62 6a 65 63 74 20 61 6e 64 20 6e  tag object and n
3630: 6f 74 20 61 72 72 61 79 20 61 66 74 65 72 20 64  ot array after d
3640: 65 6c 65 74 65 0a 0a 20 20 20 20 74 61 67 2e 69  elete..    tag.i
3650: 6e 74 61 67 73 2e 73 70 6c 69 63 65 28 31 2c 20  ntags.splice(1, 
3660: 31 29 0a 20 20 20 20 74 61 67 2e 75 70 64 61 74  1).    tag.updat
3670: 65 28 29 0a 0a 20 20 20 20 65 78 70 65 63 74 28  e()..    expect(
3680: 74 61 67 2e 74 61 67 73 2e 63 6f 6c 6f 72 29 2e  tag.tags.color).
3690: 74 6f 2e 62 65 2e 61 6e 28 27 6f 62 6a 65 63 74  to.be.an('object
36a0: 27 29 0a 0a 20 20 20 20 74 61 67 2e 75 6e 6d 6f  ')..    tag.unmo
36b0: 75 6e 74 28 29 0a 0a 20 20 7d 29 0a 0a 20 20 69  unt()..  })..  i
36c0: 74 28 27 73 75 70 70 6f 72 74 20 60 64 61 74 61  t('support `data
36d0: 2d 69 73 60 20 66 6f 72 20 68 74 6d 6c 35 20 63  -is` for html5 c
36e0: 6f 6d 70 6c 69 61 6e 63 65 27 2c 20 66 75 6e 63  ompliance', func
36f0: 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20 69 6e 6a  tion() {.    inj
3700: 65 63 74 48 54 4d 4c 28 27 3c 64 69 76 20 64 61  ectHTML('<div da
3710: 74 61 2d 69 73 3d 22 74 61 67 2d 64 61 74 61 2d  ta-is="tag-data-
3720: 69 73 22 3e 3c 2f 64 69 76 3e 27 29 0a 20 20 20  is"></div>').   
3730: 20 76 61 72 20 74 61 67 20 3d 20 72 69 6f 74 2e   var tag = riot.
3740: 6d 6f 75 6e 74 28 27 74 61 67 2d 64 61 74 61 2d  mount('tag-data-
3750: 69 73 27 29 5b 30 5d 0a 20 20 20 20 76 61 72 20  is')[0].    var 
3760: 65 6c 73 20 3d 20 24 24 28 27 70 27 2c 20 74 61  els = $$('p', ta
3770: 67 2e 72 6f 6f 74 29 0a 20 20 20 20 65 78 70 65  g.root).    expe
3780: 63 74 28 65 6c 73 2e 6c 65 6e 67 74 68 29 2e 74  ct(els.length).t
3790: 6f 2e 62 65 2e 65 71 75 61 6c 28 32 29 0a 20 20  o.be.equal(2).  
37a0: 20 20 65 78 70 65 63 74 28 65 6c 73 5b 30 5d 2e    expect(els[0].
37b0: 69 6e 6e 65 72 48 54 4d 4c 29 2e 74 6f 2e 63 6f  innerHTML).to.co
37c0: 6e 74 61 69 6e 28 27 68 74 6d 6c 35 27 29 0a 20  ntain('html5'). 
37d0: 20 20 20 65 78 70 65 63 74 28 65 6c 73 5b 31 5d     expect(els[1]
37e0: 2e 69 6e 6e 65 72 48 54 4d 4c 29 2e 74 6f 2e 63  .innerHTML).to.c
37f0: 6f 6e 74 61 69 6e 28 27 74 6f 6f 27 29 0a 20 20  ontain('too').  
3800: 20 20 74 61 67 2e 75 6e 6d 6f 75 6e 74 28 29 0a    tag.unmount().
3810: 20 20 7d 29 0a 0a 20 20 69 74 28 27 60 64 61 74    })..  it('`dat
3820: 61 2d 69 73 60 20 65 78 70 72 65 73 73 69 6f 6e  a-is` expression
3830: 73 20 77 69 6c 6c 20 62 65 20 65 76 61 6c 75 61  s will be evalua
3840: 74 65 64 20 6f 6e 6c 79 20 69 66 20 74 68 65 79  ted only if they
3850: 20 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67   return a string
3860: 27 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a  ', function() {.
3870: 20 20 20 20 69 6e 6a 65 63 74 48 54 4d 4c 28 27      injectHTML('
3880: 3c 72 69 6f 74 2d 74 6d 70 3e 3c 2f 72 69 6f 74  <riot-tmp></riot
3890: 2d 74 6d 70 3e 27 29 0a 0a 20 20 20 20 72 69 6f  -tmp>')..    rio
38a0: 74 2e 74 61 67 28 27 72 69 6f 74 2d 74 6d 70 27  t.tag('riot-tmp'
38b0: 2c 20 60 0a 20 20 20 20 20 20 3c 64 69 76 20 64  , `.      <div d
38c0: 61 74 61 2d 69 73 3d 22 7b 20 74 61 67 20 7d 22  ata-is="{ tag }"
38d0: 3e 0a 20 20 20 20 20 20 20 20 3c 70 3e 68 65 6c  >.        <p>hel
38e0: 6c 6f 3c 2f 70 3e 0a 20 20 20 20 20 20 3c 2f 64  lo</p>.      </d
38f0: 69 76 3e 0a 20 20 20 20 60 29 0a 20 20 20 20 76  iv>.    `).    v
3900: 61 72 20 74 61 67 20 3d 20 72 69 6f 74 2e 6d 6f  ar tag = riot.mo
3910: 75 6e 74 28 27 72 69 6f 74 2d 74 6d 70 27 29 5b  unt('riot-tmp')[
3920: 30 5d 0a 0a 20 20 20 20 65 78 70 65 63 74 28 24  0]..    expect($
3930: 28 27 70 27 2c 20 74 61 67 2e 72 6f 6f 74 29 2e  ('p', tag.root).
3940: 69 6e 6e 65 72 48 54 4d 4c 29 2e 74 6f 2e 62 65  innerHTML).to.be
3950: 2e 65 71 75 61 6c 28 27 68 65 6c 6c 6f 27 29 0a  .equal('hello').
3960: 0a 20 20 20 20 74 61 67 2e 75 6e 6d 6f 75 6e 74  .    tag.unmount
3970: 28 29 0a 20 20 7d 29 0a 0a 20 20 69 74 28 27 74  ().  })..  it('t
3980: 61 67 20 6e 61 6d 65 73 20 61 72 65 20 63 61 73  ag names are cas
3990: 65 20 69 6e 73 65 6e 73 69 74 69 76 65 20 28 63  e insensitive (c
39a0: 6f 6e 76 65 72 74 65 64 20 74 6f 20 6c 6f 77 65  onverted to lowe
39b0: 72 63 61 73 65 29 20 69 6e 20 60 72 69 6f 74 2e  rcase) in `riot.
39c0: 6d 6f 75 6e 74 60 27 2c 20 66 75 6e 63 74 69 6f  mount`', functio
39d0: 6e 28 29 20 7b 0a 20 20 20 20 76 61 72 20 69 2c  n() {.    var i,
39e0: 20 65 6c 73 20 3d 20 24 24 28 27 74 61 67 2d 64   els = $$('tag-d
39f0: 61 74 61 2d 69 73 2c 5b 64 61 74 61 2d 69 73 3d  ata-is,[data-is=
3a00: 22 74 61 67 2d 64 61 74 61 2d 69 73 22 5d 27 29  "tag-data-is"]')
3a10: 0a 20 20 20 20 66 6f 72 20 28 69 20 3d 20 30 3b  .    for (i = 0;
3a20: 20 69 20 3c 20 65 6c 73 2e 6c 65 6e 67 74 68 3b   i < els.length;
3a30: 20 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20 65 6c   i++) {.      el
3a40: 73 5b 69 5d 2e 70 61 72 65 6e 74 4e 6f 64 65 2e  s[i].parentNode.
3a50: 72 65 6d 6f 76 65 43 68 69 6c 64 28 65 6c 73 5b  removeChild(els[
3a60: 69 5d 29 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e  i]).    }.    in
3a70: 6a 65 63 74 48 54 4d 4c 28 27 3c 64 69 76 20 64  jectHTML('<div d
3a80: 61 74 61 2d 69 73 3d 22 74 61 67 2d 64 61 74 61  ata-is="tag-data
3a90: 2d 69 73 22 3e 3c 2f 64 69 76 3e 27 29 0a 20 20  -is"></div>').  
3aa0: 20 20 69 6e 6a 65 63 74 48 54 4d 4c 28 27 3c 74    injectHTML('<t
3ab0: 61 67 2d 44 41 54 41 2d 49 73 3e 3c 2f 74 61 67  ag-DATA-Is></tag
3ac0: 2d 44 41 54 41 2d 49 73 3e 27 29 0a 20 20 20 20  -DATA-Is>').    
3ad0: 76 61 72 20 74 61 67 73 20 3d 20 72 69 6f 74 2e  var tags = riot.
3ae0: 6d 6f 75 6e 74 28 27 74 61 67 2d 44 61 74 61 2d  mount('tag-Data-
3af0: 49 73 27 29 0a 0a 20 20 20 20 65 78 70 65 63 74  Is')..    expect
3b00: 28 74 61 67 73 2e 6c 65 6e 67 74 68 29 2e 74 6f  (tags.length).to
3b10: 2e 62 65 2e 65 71 75 61 6c 28 32 29 0a 20 20 20  .be.equal(2).   
3b20: 20 65 78 70 65 63 74 28 24 24 28 27 70 27 2c 20   expect($$('p', 
3b30: 74 61 67 73 5b 30 5d 2e 72 6f 6f 74 29 2e 6c 65  tags[0].root).le
3b40: 6e 67 74 68 29 2e 74 6f 2e 62 65 2e 65 71 75 61  ngth).to.be.equa
3b50: 6c 28 32 29 0a 20 20 20 20 65 78 70 65 63 74 28  l(2).    expect(
3b60: 24 24 28 27 70 27 2c 20 74 61 67 73 5b 31 5d 2e  $$('p', tags[1].
3b70: 72 6f 6f 74 29 2e 6c 65 6e 67 74 68 29 2e 74 6f  root).length).to
3b80: 2e 62 65 2e 65 71 75 61 6c 28 32 29 0a 20 20 20  .be.equal(2).   
3b90: 20 74 61 67 73 2e 70 75 73 68 28 74 61 67 73 5b   tags.push(tags[
3ba0: 30 5d 2c 20 74 61 67 73 5b 31 5d 29 0a 20 20 7d  0], tags[1]).  }
3bb0: 29 0a 0a 20 20 69 74 28 27 74 68 65 20 64 61 74  )..  it('the dat
3bc0: 61 2d 69 73 20 61 74 74 72 69 62 75 74 65 20 67  a-is attribute g
3bd0: 65 74 73 20 75 70 64 61 74 65 64 20 69 66 20 61  ets updated if a
3be0: 20 44 4f 4d 20 6e 6f 64 65 20 67 65 74 73 20 6d   DOM node gets m
3bf0: 6f 75 6e 74 65 64 20 75 73 69 6e 67 20 74 77 6f  ounted using two
3c00: 20 6f 72 20 6d 6f 72 65 20 64 69 66 66 65 72 65   or more differe
3c10: 6e 74 20 74 61 67 73 27 2c 20 66 75 6e 63 74 69  nt tags', functi
3c20: 6f 6e 28 29 20 7b 0a 0a 20 20 20 20 76 61 72 20  on() {..    var 
3c30: 64 69 76 20 3d 20 64 6f 63 75 6d 65 6e 74 2e 63  div = document.c
3c40: 72 65 61 74 65 45 6c 65 6d 65 6e 74 28 27 64 69  reateElement('di
3c50: 76 27 29 0a 20 20 20 20 76 61 72 20 74 61 67 31  v').    var tag1
3c60: 20 3d 20 72 69 6f 74 2e 6d 6f 75 6e 74 28 64 69   = riot.mount(di
3c70: 76 2c 20 27 74 69 6d 65 74 61 62 6c 65 27 29 5b  v, 'timetable')[
3c80: 30 5d 0a 20 20 20 20 65 78 70 65 63 74 28 64 69  0].    expect(di
3c90: 76 2e 67 65 74 41 74 74 72 69 62 75 74 65 28 27  v.getAttribute('
3ca0: 64 61 74 61 2d 69 73 27 29 29 2e 74 6f 2e 62 65  data-is')).to.be
3cb0: 2e 65 71 75 61 6c 28 27 74 69 6d 65 74 61 62 6c  .equal('timetabl
3cc0: 65 27 29 0a 20 20 20 20 76 61 72 20 74 61 67 32  e').    var tag2
3cd0: 20 3d 20 72 69 6f 74 2e 6d 6f 75 6e 74 28 64 69   = riot.mount(di
3ce0: 76 2c 20 27 74 65 73 74 27 29 5b 30 5d 0a 20 20  v, 'test')[0].  
3cf0: 20 20 65 78 70 65 63 74 28 64 69 76 2e 67 65 74    expect(div.get
3d00: 41 74 74 72 69 62 75 74 65 28 27 64 61 74 61 2d  Attribute('data-
3d10: 69 73 27 29 29 2e 74 6f 2e 62 65 2e 65 71 75 61  is')).to.be.equa
3d20: 6c 28 27 74 65 73 74 27 29 0a 0a 20 20 20 20 74  l('test')..    t
3d30: 61 67 31 2e 75 6e 6d 6f 75 6e 74 28 29 0a 20 20  ag1.unmount().  
3d40: 20 20 74 61 67 32 2e 75 6e 6d 6f 75 6e 74 28 29    tag2.unmount()
3d50: 0a 0a 20 20 7d 29 0a 0a 20 20 69 74 28 27 74 68  ..  })..  it('th
3d60: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 60  e value of the `
3d70: 64 61 74 61 2d 69 73 60 20 61 74 74 72 69 62 75  data-is` attribu
3d80: 74 65 20 6e 65 65 64 73 20 6c 6f 77 65 72 63 61  te needs lowerca
3d90: 73 65 20 6e 61 6d 65 73 27 2c 20 66 75 6e 63 74  se names', funct
3da0: 69 6f 6e 28 29 20 7b 0a 20 20 20 20 76 61 72 20  ion() {.    var 
3db0: 69 2c 20 65 6c 73 20 3d 20 24 24 28 27 74 61 67  i, els = $$('tag
3dc0: 2d 64 61 74 61 2d 69 73 2c 5b 64 61 74 61 2d 69  -data-is,[data-i
3dd0: 73 3d 22 74 61 67 2d 64 61 74 61 2d 69 73 22 5d  s="tag-data-is"]
3de0: 27 29 0a 20 20 20 20 66 6f 72 20 28 69 20 3d 20  ').    for (i = 
3df0: 30 3b 20 69 20 3c 20 65 6c 73 2e 6c 65 6e 67 74  0; i < els.lengt
3e00: 68 3b 20 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20  h; i++) {.      
3e10: 65 6c 73 5b 69 5d 2e 70 61 72 65 6e 74 4e 6f 64  els[i].parentNod
3e20: 65 2e 72 65 6d 6f 76 65 43 68 69 6c 64 28 65 6c  e.removeChild(el
3e30: 73 5b 69 5d 29 0a 20 20 20 20 7d 0a 20 20 20 20  s[i]).    }.    
3e40: 69 6e 6a 65 63 74 48 54 4d 4c 28 27 3c 64 69 76  injectHTML('<div
3e50: 20 64 61 74 61 2d 69 73 3d 22 74 61 67 2d 44 41   data-is="tag-DA
3e60: 54 41 2d 49 73 22 3e 3c 2f 64 69 76 3e 27 29 0a  TA-Is"></div>').
3e70: 20 20 20 20 76 61 72 20 74 61 67 73 20 3d 20 72      var tags = r
3e80: 69 6f 74 2e 6d 6f 75 6e 74 28 27 74 61 67 2d 44  iot.mount('tag-D
3e90: 61 74 61 2d 49 73 27 29 0a 0a 20 20 20 20 65 78  ata-Is')..    ex
3ea0: 70 65 63 74 28 74 61 67 73 2e 6c 65 6e 67 74 68  pect(tags.length
3eb0: 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 30 29  ).to.be.equal(0)
3ec0: 0a 20 20 7d 29 0a 0a 20 20 69 74 28 27 64 61 74  .  })..  it('dat
3ed0: 61 2d 69 73 20 61 73 20 65 78 70 72 65 73 73 69  a-is as expressi
3ee0: 6f 6e 27 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20  on', function() 
3ef0: 7b 0a 20 20 20 20 69 6e 6a 65 63 74 48 54 4d 4c  {.    injectHTML
3f00: 28 27 3c 63 6f 6e 74 61 69 6e 65 72 2d 72 69 6f  ('<container-rio
3f10: 74 3e 3c 2f 63 6f 6e 74 61 69 6e 65 72 2d 72 69  t></container-ri
3f20: 6f 74 3e 27 29 0a 20 20 20 20 76 61 72 20 74 61  ot>').    var ta
3f30: 67 20 3d 20 72 69 6f 74 2e 6d 6f 75 6e 74 28 27  g = riot.mount('
3f40: 63 6f 6e 74 61 69 6e 65 72 2d 72 69 6f 74 27 29  container-riot')
3f50: 5b 30 5d 0a 20 20 20 20 76 61 72 20 64 69 76 20  [0].    var div 
3f60: 3d 20 24 28 27 64 69 76 27 2c 20 74 61 67 2e 72  = $('div', tag.r
3f70: 6f 6f 74 29 0a 20 20 20 20 65 78 70 65 63 74 28  oot).    expect(
3f80: 64 69 76 2e 67 65 74 41 74 74 72 69 62 75 74 65  div.getAttribute
3f90: 28 27 64 61 74 61 2d 69 73 27 29 29 2e 74 6f 2e  ('data-is')).to.
3fa0: 62 65 2e 65 71 75 61 6c 28 27 6e 65 73 74 65 64  be.equal('nested
3fb0: 2d 72 69 6f 74 27 29 0a 20 20 20 20 74 61 67 2e  -riot').    tag.
3fc0: 75 6e 6d 6f 75 6e 74 28 29 0a 20 20 7d 29 0a 0a  unmount().  })..
3fd0: 20 20 69 74 28 27 64 61 74 61 2d 69 73 20 61 74    it('data-is at
3fe0: 74 72 69 62 75 74 65 20 62 79 20 74 61 67 20 6e  tribute by tag n
3ff0: 61 6d 65 27 2c 20 66 75 6e 63 74 69 6f 6e 28 29  ame', function()
4000: 20 7b 0a 0a 20 20 20 20 2f 2f 20 64 61 74 61 2d   {..    // data-
4010: 69 73 20 61 74 74 72 69 62 75 74 65 20 62 79 20  is attribute by 
4020: 74 61 67 20 6e 61 6d 65 0a 0a 20 20 20 20 72 69  tag name..    ri
4030: 6f 74 2e 74 61 67 28 27 72 74 61 67 32 27 2c 20  ot.tag('rtag2', 
4040: 27 3c 70 3e 76 61 6c 3a 20 7b 20 6f 70 74 73 2e  '<p>val: { opts.
4050: 76 61 6c 20 7d 3c 2f 70 3e 27 29 0a 0a 20 20 20  val }</p>')..   
4060: 20 69 6e 6a 65 63 74 48 54 4d 4c 28 27 3c 64 69   injectHTML('<di
4070: 76 20 64 61 74 61 2d 69 73 3d 22 72 74 61 67 32  v data-is="rtag2
4080: 22 3e 3c 2f 64 69 76 3e 27 29 0a 0a 20 20 20 20  "></div>')..    
4090: 76 61 72 20 74 61 67 20 3d 20 72 69 6f 74 2e 6d  var tag = riot.m
40a0: 6f 75 6e 74 28 27 72 74 61 67 32 27 2c 20 7b 20  ount('rtag2', { 
40b0: 76 61 6c 3a 20 31 30 20 7d 29 5b 30 5d 0a 20 20  val: 10 })[0].  
40c0: 20 20 65 78 70 65 63 74 28 6e 6f 72 6d 61 6c 69    expect(normali
40d0: 7a 65 48 54 4d 4c 28 74 61 67 2e 72 6f 6f 74 2e  zeHTML(tag.root.
40e0: 69 6e 6e 65 72 48 54 4d 4c 29 29 2e 74 6f 2e 62  innerHTML)).to.b
40f0: 65 2e 65 71 75 61 6c 28 27 3c 70 3e 76 61 6c 3a  e.equal('<p>val:
4100: 20 31 30 3c 2f 70 3e 27 29 0a 0a 20 20 20 20 74   10</p>')..    t
4110: 61 67 2e 75 6e 6d 6f 75 6e 74 28 29 0a 20 20 20  ag.unmount().   
4120: 20 65 78 70 65 63 74 28 24 24 28 27 72 74 61 67   expect($$('rtag
4130: 32 27 29 2e 6c 65 6e 67 74 68 29 2e 74 6f 2e 62  2').length).to.b
4140: 65 2e 65 71 75 61 6c 28 30 29 0a 0a 20 20 7d 29  e.equal(0)..  })
4150: 0a 0a 0a 20 20 69 74 28 27 64 61 74 61 2d 69 73  ...  it('data-is
4160: 20 61 74 74 72 69 62 75 74 65 20 75 73 69 6e 67   attribute using
4170: 20 74 68 65 20 22 2a 22 20 73 65 6c 65 63 74 6f   the "*" selecto
4180: 72 27 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b  r', function() {
4190: 0a 0a 20 20 20 20 69 6e 6a 65 63 74 48 54 4d 4c  ..    injectHTML
41a0: 28 5b 0a 20 20 20 20 20 20 27 3c 64 69 76 20 69  ([.      '<div i
41b0: 64 3d 22 72 74 61 67 2d 6e 65 73 74 65 64 22 3e  d="rtag-nested">
41c0: 27 2c 0a 20 20 20 20 20 20 27 20 20 3c 64 69 76  ',.      '  <div
41d0: 20 64 61 74 61 2d 69 73 3d 22 72 74 61 67 22 3e   data-is="rtag">
41e0: 3c 2f 64 69 76 3e 27 2c 0a 20 20 20 20 20 20 27  </div>',.      '
41f0: 20 20 3c 64 69 76 20 64 61 74 61 2d 69 73 3d 22    <div data-is="
4200: 72 74 61 67 22 3e 3c 2f 64 69 76 3e 27 2c 0a 20  rtag"></div>',. 
4210: 20 20 20 20 20 27 20 20 3c 64 69 76 20 64 61 74       '  <div dat
4220: 61 2d 69 73 3d 22 72 74 61 67 22 3e 3c 2f 64 69  a-is="rtag"></di
4230: 76 3e 27 2c 0a 20 20 20 20 20 20 27 3c 2f 64 69  v>',.      '</di
4240: 76 3e 27 0a 20 20 20 20 5d 29 0a 0a 20 20 20 20  v>'.    ])..    
4250: 76 61 72 20 73 75 62 54 61 67 73 20 3d 20 72 69  var subTags = ri
4260: 6f 74 2e 6d 6f 75 6e 74 28 27 23 72 74 61 67 2d  ot.mount('#rtag-
4270: 6e 65 73 74 65 64 27 2c 20 27 2a 27 2c 20 7b 20  nested', '*', { 
4280: 76 61 6c 3a 20 31 30 20 7d 29 0a 0a 20 20 20 20  val: 10 })..    
4290: 65 78 70 65 63 74 28 73 75 62 54 61 67 73 2e 6c  expect(subTags.l
42a0: 65 6e 67 74 68 29 2e 74 6f 2e 62 65 2e 65 71 75  ength).to.be.equ
42b0: 61 6c 28 33 29 0a 0a 20 20 20 20 65 78 70 65 63  al(3)..    expec
42c0: 74 28 6e 6f 72 6d 61 6c 69 7a 65 48 54 4d 4c 28  t(normalizeHTML(
42d0: 73 75 62 54 61 67 73 5b 30 5d 2e 72 6f 6f 74 2e  subTags[0].root.
42e0: 69 6e 6e 65 72 48 54 4d 4c 29 29 2e 74 6f 2e 62  innerHTML)).to.b
42f0: 65 2e 65 71 75 61 6c 28 27 3c 70 3e 76 61 6c 3a  e.equal('<p>val:
4300: 20 31 30 3c 2f 70 3e 27 29 0a 20 20 20 20 65 78   10</p>').    ex
4310: 70 65 63 74 28 6e 6f 72 6d 61 6c 69 7a 65 48 54  pect(normalizeHT
4320: 4d 4c 28 73 75 62 54 61 67 73 5b 31 5d 2e 72 6f  ML(subTags[1].ro
4330: 6f 74 2e 69 6e 6e 65 72 48 54 4d 4c 29 29 2e 74  ot.innerHTML)).t
4340: 6f 2e 62 65 2e 65 71 75 61 6c 28 27 3c 70 3e 76  o.be.equal('<p>v
4350: 61 6c 3a 20 31 30 3c 2f 70 3e 27 29 0a 20 20 20  al: 10</p>').   
4360: 20 65 78 70 65 63 74 28 6e 6f 72 6d 61 6c 69 7a   expect(normaliz
4370: 65 48 54 4d 4c 28 73 75 62 54 61 67 73 5b 32 5d  eHTML(subTags[2]
4380: 2e 72 6f 6f 74 2e 69 6e 6e 65 72 48 54 4d 4c 29  .root.innerHTML)
4390: 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27 3c  ).to.be.equal('<
43a0: 70 3e 76 61 6c 3a 20 31 30 3c 2f 70 3e 27 29 0a  p>val: 10</p>').
43b0: 0a 20 20 20 20 73 75 62 54 61 67 73 2e 66 6f 72  .    subTags.for
43c0: 45 61 63 68 28 74 61 67 20 3d 3e 20 74 61 67 2e  Each(tag => tag.
43d0: 75 6e 6d 6f 75 6e 74 28 29 29 0a 0a 20 20 7d 29  unmount())..  })
43e0: 0a 0a 0a 20 20 69 74 28 27 74 6f 70 20 6c 65 76  ...  it('top lev
43f0: 65 6c 20 61 74 74 72 20 6d 61 6e 69 70 75 6c 61  el attr manipula
4400: 74 69 6f 6e 27 2c 20 66 75 6e 63 74 69 6f 6e 28  tion', function(
4410: 29 20 7b 0a 0a 20 20 20 20 69 6e 6a 65 63 74 48  ) {..    injectH
4420: 54 4d 4c 28 27 3c 74 6f 70 2d 6c 65 76 65 6c 2d  TML('<top-level-
4430: 61 74 74 72 20 76 61 6c 75 65 3d 22 69 6e 69 74  attr value="init
4440: 69 61 6c 22 3e 3c 2f 74 6f 70 2d 6c 65 76 65 6c  ial"></top-level
4450: 2d 61 74 74 72 3e 27 29 0a 0a 20 20 20 20 72 69  -attr>')..    ri
4460: 6f 74 2e 74 61 67 28 27 74 6f 70 2d 6c 65 76 65  ot.tag('top-leve
4470: 6c 2d 61 74 74 72 27 2c 20 27 7b 6f 70 74 73 2e  l-attr', '{opts.
4480: 76 61 6c 75 65 7d 27 29 0a 0a 20 20 20 20 76 61  value}')..    va
4490: 72 20 74 61 67 20 3d 20 72 69 6f 74 2e 6d 6f 75  r tag = riot.mou
44a0: 6e 74 28 27 74 6f 70 2d 6c 65 76 65 6c 2d 61 74  nt('top-level-at
44b0: 74 72 27 29 5b 30 5d 0a 0a 20 20 20 20 74 61 67  tr')[0]..    tag
44c0: 2e 72 6f 6f 74 2e 73 65 74 41 74 74 72 69 62 75  .root.setAttribu
44d0: 74 65 28 27 76 61 6c 75 65 27 2c 20 27 63 68 61  te('value', 'cha
44e0: 6e 67 65 64 27 29 0a 20 20 20 20 74 61 67 2e 75  nged').    tag.u
44f0: 70 64 61 74 65 28 29 0a 0a 20 20 20 20 65 78 70  pdate()..    exp
4500: 65 63 74 28 74 61 67 2e 72 6f 6f 74 2e 69 6e 6e  ect(tag.root.inn
4510: 65 72 48 54 4d 4c 29 2e 74 6f 2e 62 65 2e 65 71  erHTML).to.be.eq
4520: 75 61 6c 28 27 63 68 61 6e 67 65 64 27 29 0a 0a  ual('changed')..
4530: 20 20 20 20 74 61 67 2e 75 6e 6d 6f 75 6e 74 28      tag.unmount(
4540: 29 0a 20 20 7d 29 0a 0a 20 20 69 74 28 27 53 56  ).  })..  it('SV
4550: 47 73 20 78 6c 69 6e 6b 20 61 74 74 72 69 62 75  Gs xlink attribu
4560: 74 65 73 20 67 65 74 20 63 6f 72 72 65 63 74 6c  tes get correctl
4570: 79 20 70 61 72 73 65 64 27 2c 20 66 75 6e 63 74  y parsed', funct
4580: 69 6f 6e 28 29 20 7b 0a 20 20 20 20 69 6e 6a 65  ion() {.    inje
4590: 63 74 48 54 4d 4c 28 27 3c 73 76 67 2d 61 74 74  ctHTML('<svg-att
45a0: 72 3e 3c 2f 73 76 67 2d 61 74 74 72 3e 27 29 0a  r></svg-attr>').
45b0: 20 20 20 20 76 61 72 20 74 61 67 20 3d 20 72 69      var tag = ri
45c0: 6f 74 2e 6d 6f 75 6e 74 28 27 73 76 67 2d 61 74  ot.mount('svg-at
45d0: 74 72 27 29 5b 30 5d 0a 0a 20 20 20 20 65 78 70  tr')[0]..    exp
45e0: 65 63 74 28 74 61 67 2e 72 65 66 73 2e 74 61 72  ect(tag.refs.tar
45f0: 67 65 74 2e 67 65 74 41 74 74 72 69 62 75 74 65  get.getAttribute
4600: 4e 53 28 27 68 74 74 70 3a 2f 2f 77 77 77 2e 77  NS('http://www.w
4610: 33 2e 6f 72 67 2f 31 39 39 39 2f 78 6c 69 6e 6b  3.org/1999/xlink
4620: 27 2c 20 27 68 72 65 66 27 29 29 2e 74 6f 2e 62  ', 'href')).to.b
4630: 65 2e 65 71 75 61 6c 28 74 61 67 2e 68 72 65 66  e.equal(tag.href
4640: 29 0a 20 20 20 20 74 61 67 2e 75 6e 6d 6f 75 6e  ).    tag.unmoun
4650: 74 28 29 0a 20 20 7d 29 0a 0a 20 20 69 74 28 27  t().  })..  it('
4660: 70 72 65 73 65 72 76 65 20 61 74 74 72 69 62 75  preserve attribu
4670: 74 65 73 20 66 72 6f 6d 20 74 61 67 20 64 65 66  tes from tag def
4680: 69 6e 69 74 69 6f 6e 27 2c 20 66 75 6e 63 74 69  inition', functi
4690: 6f 6e 28 29 20 7b 0a 0a 0a 20 20 20 20 69 6e 6a  on() {...    inj
46a0: 65 63 74 48 54 4d 4c 28 27 3c 70 72 65 73 65 72  ectHTML('<preser
46b0: 76 65 2d 61 74 74 72 3e 3c 2f 70 72 65 73 65 72  ve-attr></preser
46c0: 76 65 2d 61 74 74 72 3e 3c 64 69 76 20 64 61 74  ve-attr><div dat
46d0: 61 2d 69 73 3d 22 70 72 65 73 65 72 76 65 2d 61  a-is="preserve-a
46e0: 74 74 72 32 22 3e 3c 2f 64 69 76 3e 27 29 0a 0a  ttr2"></div>')..
46f0: 20 20 20 20 76 61 72 20 74 61 67 20 3d 20 72 69      var tag = ri
4700: 6f 74 2e 6d 6f 75 6e 74 28 27 70 72 65 73 65 72  ot.mount('preser
4710: 76 65 2d 61 74 74 72 27 29 5b 30 5d 0a 20 20 20  ve-attr')[0].   
4720: 20 65 78 70 65 63 74 28 74 61 67 2e 72 6f 6f 74   expect(tag.root
4730: 2e 63 6c 61 73 73 4e 61 6d 65 29 2e 74 6f 2e 62  .className).to.b
4740: 65 2e 65 71 75 61 6c 28 27 73 69 6e 67 6c 65 2d  e.equal('single-
4750: 71 75 6f 74 65 27 29 0a 20 20 20 20 76 61 72 20  quote').    var 
4760: 74 61 67 32 20 3d 20 72 69 6f 74 2e 6d 6f 75 6e  tag2 = riot.moun
4770: 74 28 27 70 72 65 73 65 72 76 65 2d 61 74 74 72  t('preserve-attr
4780: 32 27 29 5b 30 5d 0a 20 20 20 20 65 78 70 65 63  2')[0].    expec
4790: 74 28 74 61 67 32 2e 72 6f 6f 74 2e 63 6c 61 73  t(tag2.root.clas
47a0: 73 4e 61 6d 65 29 2e 74 6f 2e 62 65 2e 65 71 75  sName).to.be.equ
47b0: 61 6c 28 27 64 6f 75 62 6c 65 2d 71 75 6f 74 65  al('double-quote
47c0: 27 29 0a 20 20 20 20 74 61 67 2e 75 6e 6d 6f 75  ').    tag.unmou
47d0: 6e 74 28 29 0a 20 20 20 20 74 61 67 32 2e 75 6e  nt().    tag2.un
47e0: 6d 6f 75 6e 74 28 29 0a 20 20 7d 29 0a 0a 20 20  mount().  })..  
47f0: 69 74 28 27 70 72 65 63 6f 6d 70 69 6c 65 64 20  it('precompiled 
4800: 74 61 67 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  tag compatibilit
4810: 79 27 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b  y', function() {
4820: 0a 0a 20 20 20 20 69 6e 6a 65 63 74 48 54 4d 4c  ..    injectHTML
4830: 28 27 3c 70 72 65 63 6f 6d 70 69 6c 65 64 3e 3c  ('<precompiled><
4840: 2f 70 72 65 63 6f 6d 70 69 6c 65 64 3e 27 29 0a  /precompiled>').
4850: 20 20 20 20 72 69 6f 74 2e 74 61 67 28 27 70 72      riot.tag('pr
4860: 65 63 6f 6d 70 69 6c 65 64 27 2c 20 27 48 45 4c  ecompiled', 'HEL
4870: 4c 4f 21 27 2c 20 27 70 72 65 63 6f 6d 70 69 6c  LO!', 'precompil
4880: 65 64 2c 20 5b 64 61 74 61 2d 69 73 3d 22 70 72  ed, [data-is="pr
4890: 65 63 6f 6d 70 69 6c 65 64 22 5d 20 20 7b 20 63  ecompiled"]  { c
48a0: 6f 6c 6f 72 3a 20 72 65 64 20 7d 27 2c 20 66 75  olor: red }', fu
48b0: 6e 63 74 69 6f 6e 28 6f 70 74 73 29 20 7b 0a 20  nction(opts) {. 
48c0: 20 20 20 20 20 74 68 69 73 2e 6e 6f 74 68 69 6e       this.nothin
48d0: 67 20 3d 20 6f 70 74 73 2e 6e 6f 74 68 69 6e 67  g = opts.nothing
48e0: 0a 20 20 20 20 7d 29 0a 0a 20 20 20 20 76 61 72  .    })..    var
48f0: 20 74 61 67 20 3d 20 72 69 6f 74 2e 6d 6f 75 6e   tag = riot.moun
4900: 74 28 27 70 72 65 63 6f 6d 70 69 6c 65 64 27 29  t('precompiled')
4910: 5b 30 5d 0a 20 20 20 20 65 78 70 65 63 74 28 77  [0].    expect(w
4920: 69 6e 64 6f 77 2e 67 65 74 43 6f 6d 70 75 74 65  indow.getCompute
4930: 64 53 74 79 6c 65 28 74 61 67 2e 72 6f 6f 74 2c  dStyle(tag.root,
4940: 20 6e 75 6c 6c 29 2e 63 6f 6c 6f 72 29 2e 74 6f   null).color).to
4950: 2e 62 65 2e 65 71 75 61 6c 28 27 72 67 62 28 32  .be.equal('rgb(2
4960: 35 35 2c 20 30 2c 20 30 29 27 29 0a 20 20 20 20  55, 0, 0)').    
4970: 74 61 67 2e 75 6e 6d 6f 75 6e 74 28 29 0a 0a 20  tag.unmount().. 
4980: 20 7d 29 0a 0a 20 20 69 74 28 27 73 74 61 74 69   })..  it('stati
4990: 63 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 67  c referenced tag
49a0: 20 66 6f 72 20 74 61 67 73 20 70 72 6f 70 65 72   for tags proper
49b0: 74 79 27 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20  ty', function() 
49c0: 7b 0a 20 20 20 20 69 6e 6a 65 63 74 48 54 4d 4c  {.    injectHTML
49d0: 28 27 3c 6e 61 6d 65 64 2d 63 68 69 6c 64 2d 70  ('<named-child-p
49e0: 61 72 65 6e 74 3e 3c 2f 6e 61 6d 65 64 2d 63 68  arent></named-ch
49f0: 69 6c 64 2d 70 61 72 65 6e 74 3e 27 29 0a 20 20  ild-parent>').  
4a00: 20 20 76 61 72 20 74 61 67 20 3d 20 72 69 6f 74    var tag = riot
4a10: 2e 6d 6f 75 6e 74 28 27 6e 61 6d 65 64 2d 63 68  .mount('named-ch
4a20: 69 6c 64 2d 70 61 72 65 6e 74 27 29 5b 30 5d 0a  ild-parent')[0].
4a30: 20 20 20 20 65 78 70 65 63 74 28 74 61 67 2e 72      expect(tag.r
4a40: 65 66 73 5b 27 74 61 67 73 2d 63 68 69 6c 64 27  efs['tags-child'
4a50: 5d 2e 72 6f 6f 74 2e 69 6e 6e 65 72 48 54 4d 4c  ].root.innerHTML
4a60: 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27 49  ).to.be.equal('I
4a70: 20 68 61 76 65 20 61 20 6e 61 6d 65 27 29 0a 0a   have a name')..
4a80: 20 20 20 20 74 61 67 2e 75 6e 6d 6f 75 6e 74 28      tag.unmount(
4a90: 29 0a 20 20 7d 29 0a 0a 20 20 69 74 28 27 70 72  ).  })..  it('pr
4aa0: 65 73 65 72 76 65 20 74 68 65 20 6d 6f 75 6e 74  eserve the mount
4ab0: 20 6f 72 64 65 72 2c 20 66 69 72 73 74 20 74 68   order, first th
4ac0: 65 20 70 61 72 65 6e 74 20 61 6e 64 20 74 68 65  e parent and the
4ad0: 6e 20 61 6c 6c 20 74 68 65 20 63 68 69 6c 64 72  n all the childr
4ae0: 65 6e 27 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20  en', function() 
4af0: 7b 0a 0a 20 20 20 20 69 6e 6a 65 63 74 48 54 4d  {..    injectHTM
4b00: 4c 28 27 3c 64 65 66 65 72 72 65 64 2d 6d 6f 75  L('<deferred-mou
4b10: 6e 74 3e 3c 2f 64 65 66 65 72 72 65 64 2d 6d 6f  nt></deferred-mo
4b20: 75 6e 74 3e 27 29 0a 0a 20 20 20 20 76 61 72 20  unt>')..    var 
4b30: 63 6f 72 72 65 63 74 4d 6f 75 6e 74 69 6e 67 4f  correctMountingO
4b40: 72 64 65 72 20 3d 20 5b 0a 20 20 20 20 20 20 20  rder = [.       
4b50: 20 27 64 65 66 65 72 72 65 64 2d 6d 6f 75 6e 74   'deferred-mount
4b60: 27 2c 0a 20 20 20 20 20 20 20 20 27 64 65 66 65  ',.        'defe
4b70: 72 72 65 64 2d 63 68 69 6c 64 2d 31 27 2c 0a 20  rred-child-1',. 
4b80: 20 20 20 20 20 20 20 27 64 65 66 65 72 72 65 64         'deferred
4b90: 2d 63 68 69 6c 64 2d 32 27 2c 0a 20 20 20 20 20  -child-2',.     
4ba0: 20 20 20 27 64 65 66 65 72 72 65 64 2d 6c 6f 6f     'deferred-loo
4bb0: 70 27 2c 0a 20 20 20 20 20 20 20 20 27 64 65 66  p',.        'def
4bc0: 65 72 72 65 64 2d 6c 6f 6f 70 27 2c 0a 20 20 20  erred-loop',.   
4bd0: 20 20 20 20 20 27 64 65 66 65 72 72 65 64 2d 6c       'deferred-l
4be0: 6f 6f 70 27 2c 0a 20 20 20 20 20 20 20 20 27 64  oop',.        'd
4bf0: 65 66 65 72 72 65 64 2d 6c 6f 6f 70 27 2c 0a 20  eferred-loop',. 
4c00: 20 20 20 20 20 20 20 27 64 65 66 65 72 72 65 64         'deferred
4c10: 2d 6c 6f 6f 70 27 0a 20 20 20 20 20 20 5d 2c 0a  -loop'.      ],.
4c20: 20 20 20 20 20 20 6d 6f 75 6e 74 69 6e 67 4f 72        mountingOr
4c30: 64 65 72 20 3d 20 5b 5d 2c 0a 20 20 20 20 20 20  der = [],.      
4c40: 63 62 20 3d 20 66 75 6e 63 74 69 6f 6e 28 74 61  cb = function(ta
4c50: 67 4e 61 6d 65 2c 20 63 68 69 6c 64 54 61 67 29  gName, childTag)
4c60: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 6d 61   {.        // ma
4c70: 6b 65 20 73 75 72 65 20 74 68 65 20 6d 6f 75 6e  ke sure the moun
4c80: 74 20 65 76 65 6e 74 20 67 65 74 73 20 74 72 69  t event gets tri
4c90: 67 67 65 72 65 64 20 77 68 65 6e 20 61 6c 6c 20  ggered when all 
4ca0: 74 68 65 20 63 68 69 6c 64 72 65 6e 20 74 61 67  the children tag
4cb0: 73 0a 20 20 20 20 20 20 20 20 2f 2f 20 61 72 65  s.        // are
4cc0: 20 69 6e 20 74 68 65 20 44 4f 4d 0a 20 20 20 20   in the DOM.    
4cd0: 20 20 20 20 65 78 70 65 63 74 28 64 6f 63 75 6d      expect(docum
4ce0: 65 6e 74 2e 63 6f 6e 74 61 69 6e 73 28 63 68 69  ent.contains(chi
4cf0: 6c 64 54 61 67 2e 72 6f 6f 74 29 29 2e 74 6f 2e  ldTag.root)).to.
4d00: 62 65 2e 65 71 75 61 6c 28 74 72 75 65 29 0a 20  be.equal(true). 
4d10: 20 20 20 20 20 20 20 6d 6f 75 6e 74 69 6e 67 4f         mountingO
4d20: 72 64 65 72 2e 70 75 73 68 28 74 61 67 4e 61 6d  rder.push(tagNam
4d30: 65 29 0a 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  e).      },.    
4d40: 20 20 74 61 67 20 3d 20 72 69 6f 74 2e 6d 6f 75    tag = riot.mou
4d50: 6e 74 28 27 64 65 66 65 72 72 65 64 2d 6d 6f 75  nt('deferred-mou
4d60: 6e 74 27 2c 20 7b 20 6f 6e 6d 6f 75 6e 74 3a 20  nt', { onmount: 
4d70: 63 62 20 7d 29 5b 30 5d 0a 0a 20 20 20 20 65 78  cb })[0]..    ex
4d80: 70 65 63 74 28 6d 6f 75 6e 74 69 6e 67 4f 72 64  pect(mountingOrd
4d90: 65 72 2e 6a 6f 69 6e 28 29 29 2e 74 6f 2e 62 65  er.join()).to.be
4da0: 2e 65 71 75 61 6c 28 63 6f 72 72 65 63 74 4d 6f  .equal(correctMo
4db0: 75 6e 74 69 6e 67 4f 72 64 65 72 2e 6a 6f 69 6e  untingOrder.join
4dc0: 28 29 29 0a 0a 20 20 20 20 74 61 67 2e 75 6e 6d  ())..    tag.unm
4dd0: 6f 75 6e 74 28 29 0a 20 20 7d 29 0a 0a 0a 20 20  ount().  })...  
4de0: 69 74 28 27 6e 6f 20 75 70 64 61 74 65 20 73 68  it('no update sh
4df0: 6f 75 6c 64 20 62 65 20 74 72 69 67 67 65 72 65  ould be triggere
4e00: 64 20 69 66 20 74 68 65 20 70 72 65 76 65 6e 74  d if the prevent
4e10: 55 70 64 61 74 65 20 66 6c 61 67 20 69 73 20 73  Update flag is s
4e20: 65 74 27 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20  et', function() 
4e30: 7b 0a 0a 20 20 20 20 69 6e 6a 65 63 74 48 54 4d  {..    injectHTM
4e40: 4c 28 27 3c 70 72 65 76 65 6e 74 2d 75 70 64 61  L('<prevent-upda
4e50: 74 65 3e 3c 2f 70 72 65 76 65 6e 74 2d 75 70 64  te></prevent-upd
4e60: 61 74 65 3e 27 29 0a 0a 20 20 20 20 76 61 72 20  ate>')..    var 
4e70: 74 61 67 20 3d 20 72 69 6f 74 2e 6d 6f 75 6e 74  tag = riot.mount
4e80: 28 27 70 72 65 76 65 6e 74 2d 75 70 64 61 74 65  ('prevent-update
4e90: 27 29 5b 30 5d 0a 0a 20 20 20 20 65 78 70 65 63  ')[0]..    expec
4ea0: 74 28 74 61 67 2e 72 65 66 73 5b 27 66 61 6e 63  t(tag.refs['fanc
4eb0: 79 2d 6e 61 6d 65 27 5d 2e 69 6e 6e 65 72 48 54  y-name'].innerHT
4ec0: 4d 4c 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28  ML).to.be.equal(
4ed0: 27 6a 6f 68 6e 27 29 0a 0a 20 20 20 20 66 69 72  'john')..    fir
4ee0: 65 45 76 65 6e 74 28 24 24 28 27 70 27 29 5b 30  eEvent($$('p')[0
4ef0: 5d 2c 20 27 63 6c 69 63 6b 27 29 0a 0a 20 20 20  ], 'click')..   
4f00: 20 65 78 70 65 63 74 28 74 61 67 2e 72 65 66 73   expect(tag.refs
4f10: 5b 27 66 61 6e 63 79 2d 6e 61 6d 65 27 5d 2e 69  ['fancy-name'].i
4f20: 6e 6e 65 72 48 54 4d 4c 29 2e 74 6f 2e 62 65 2e  nnerHTML).to.be.
4f30: 65 71 75 61 6c 28 27 6a 6f 68 6e 27 29 0a 0a 20  equal('john').. 
4f40: 20 20 20 74 61 67 2e 75 6e 6d 6f 75 6e 74 28 29     tag.unmount()
4f50: 0a 20 20 7d 29 0a 0a 20 20 69 74 28 27 74 68 65  .  })..  it('the
4f60: 20 62 65 66 6f 72 65 20 65 76 65 6e 74 73 20 67   before events g
4f70: 65 74 20 74 72 69 67 67 65 72 65 64 27 2c 20 66  et triggered', f
4f80: 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20  unction() {.    
4f90: 69 6e 6a 65 63 74 48 54 4d 4c 28 27 3c 62 65 66  injectHTML('<bef
4fa0: 6f 72 65 2d 65 76 65 6e 74 73 3e 3c 2f 62 65 66  ore-events></bef
4fb0: 6f 72 65 2d 65 76 65 6e 74 73 3e 27 29 0a 20 20  ore-events>').  
4fc0: 20 20 76 61 72 20 74 61 67 2c 0a 20 20 20 20 20    var tag,.     
4fd0: 20 69 6e 63 72 65 6d 65 6e 74 45 76 65 6e 74 73   incrementEvents
4fe0: 20 3d 20 73 69 6e 6f 6e 2e 73 70 79 28 29 0a 0a   = sinon.spy()..
4ff0: 20 20 20 20 72 69 6f 74 2e 74 61 67 28 27 62 65      riot.tag('be
5000: 66 6f 72 65 2d 65 76 65 6e 74 73 27 2c 20 27 27  fore-events', ''
5010: 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20  , function() {. 
5020: 20 20 20 20 20 74 68 69 73 2e 6f 6e 28 27 62 65       this.on('be
5030: 66 6f 72 65 2d 6d 6f 75 6e 74 27 2c 20 69 6e 63  fore-mount', inc
5040: 72 65 6d 65 6e 74 45 76 65 6e 74 73 29 0a 20 20  rementEvents).  
5050: 20 20 20 20 74 68 69 73 2e 6f 6e 28 27 62 65 66      this.on('bef
5060: 6f 72 65 2d 75 6e 6d 6f 75 6e 74 27 2c 20 69 6e  ore-unmount', in
5070: 63 72 65 6d 65 6e 74 45 76 65 6e 74 73 29 0a 20  crementEvents). 
5080: 20 20 20 7d 29 0a 20 20 20 20 74 61 67 20 3d 20     }).    tag = 
5090: 72 69 6f 74 2e 6d 6f 75 6e 74 28 64 6f 63 75 6d  riot.mount(docum
50a0: 65 6e 74 2e 63 72 65 61 74 65 45 6c 65 6d 65 6e  ent.createElemen
50b0: 74 28 27 62 65 66 6f 72 65 2d 65 76 65 6e 74 73  t('before-events
50c0: 27 29 29 5b 30 5d 0a 20 20 20 20 74 61 67 2e 75  '))[0].    tag.u
50d0: 6e 6d 6f 75 6e 74 28 29 0a 20 20 20 20 65 78 70  nmount().    exp
50e0: 65 63 74 28 69 6e 63 72 65 6d 65 6e 74 45 76 65  ect(incrementEve
50f0: 6e 74 73 29 2e 74 6f 2e 68 61 76 65 2e 62 65 65  nts).to.have.bee
5100: 6e 2e 63 61 6c 6c 65 64 54 77 69 63 65 0a 20 20  n.calledTwice.  
5110: 7d 29 0a 0a 20 20 69 74 28 27 74 68 65 20 62 65  })..  it('the be
5120: 66 6f 72 65 20 6d 6f 75 6e 74 20 65 76 65 6e 74  fore mount event
5130: 20 67 65 74 73 20 74 72 69 67 67 65 72 65 64 20   gets triggered 
5140: 62 65 66 6f 72 65 20 74 68 65 20 63 6f 6d 70 6f  before the compo
5150: 6e 65 6e 74 20 6d 61 72 6b 75 70 20 63 72 65 61  nent markup crea
5160: 74 69 6f 6e 27 2c 20 66 75 6e 63 74 69 6f 6e 28  tion', function(
5170: 29 20 7b 0a 20 20 20 20 69 6e 6a 65 63 74 48 54  ) {.    injectHT
5180: 4d 4c 28 27 3c 72 69 6f 74 2d 74 6d 70 3e 3c 2f  ML('<riot-tmp></
5190: 72 69 6f 74 2d 74 6d 70 3e 27 29 0a 0a 20 20 20  riot-tmp>')..   
51a0: 20 72 69 6f 74 2e 74 61 67 28 27 72 69 6f 74 2d   riot.tag('riot-
51b0: 74 6d 70 27 2c 20 60 0a 20 20 20 20 20 20 3c 70  tmp', `.      <p
51c0: 3e 7b 20 66 6c 61 67 20 7d 3c 70 3e 0a 20 20 20  >{ flag }<p>.   
51d0: 20 60 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b   `, function() {
51e0: 0a 20 20 20 20 20 20 74 68 69 73 2e 66 6c 61 67  .      this.flag
51f0: 20 3d 20 74 72 75 65 0a 20 20 20 20 20 20 74 68   = true.      th
5200: 69 73 2e 6f 6e 28 27 62 65 66 6f 72 65 2d 6d 6f  is.on('before-mo
5210: 75 6e 74 27 2c 20 28 29 20 3d 3e 20 7b 0a 20 20  unt', () => {.  
5220: 20 20 20 20 20 20 74 68 69 73 2e 66 6c 61 67 20        this.flag 
5230: 3d 20 66 61 6c 73 65 0a 20 20 20 20 20 20 7d 29  = false.      })
5240: 0a 20 20 20 20 7d 29 0a 0a 20 20 20 20 76 61 72  .    })..    var
5250: 20 74 61 67 20 3d 20 72 69 6f 74 2e 6d 6f 75 6e   tag = riot.moun
5260: 74 28 27 72 69 6f 74 2d 74 6d 70 27 29 5b 30 5d  t('riot-tmp')[0]
5270: 0a 0a 20 20 20 20 65 78 70 65 63 74 28 24 28 27  ..    expect($('
5280: 70 27 2c 20 74 61 67 2e 72 6f 6f 74 29 2e 69 6e  p', tag.root).in
5290: 6e 65 72 48 54 4d 4c 29 2e 74 6f 2e 62 65 2e 65  nerHTML).to.be.e
52a0: 71 75 61 6c 28 27 66 61 6c 73 65 27 29 0a 0a 20  qual('false').. 
52b0: 20 20 20 74 61 67 2e 75 6e 6d 6f 75 6e 74 28 29     tag.unmount()
52c0: 0a 20 20 7d 29 0a 0a 20 20 69 74 28 27 61 6c 6c  .  })..  it('all
52d0: 20 74 68 65 20 65 76 65 6e 74 73 20 67 65 74 20   the events get 
52e0: 66 69 72 65 64 20 61 6c 73 6f 20 69 6e 20 74 68  fired also in th
52f0: 65 20 6c 6f 6f 70 20 74 61 67 73 2c 20 74 68 65  e loop tags, the
5300: 20 65 2e 69 74 65 6d 20 70 72 6f 70 65 72 74 79   e.item property
5310: 20 67 65 74 73 20 70 72 65 73 65 72 76 65 64 27   gets preserved'
5320: 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20  , function() {. 
5330: 20 20 20 69 6e 6a 65 63 74 48 54 4d 4c 28 27 3c     injectHTML('<
5340: 65 76 65 6e 74 73 3e 3c 2f 65 76 65 6e 74 73 3e  events></events>
5350: 27 29 0a 20 20 20 20 76 61 72 20 63 75 72 72 65  ').    var curre
5360: 6e 74 49 74 65 6d 2c 0a 20 20 20 20 20 20 63 75  ntItem,.      cu
5370: 72 72 65 6e 74 49 6e 64 65 78 2c 0a 20 20 20 20  rrentIndex,.    
5380: 20 20 63 61 6c 6c 62 61 63 6b 43 61 6c 6c 73 20    callbackCalls 
5390: 3d 20 30 2c 0a 20 20 20 20 20 20 74 61 67 20 3d  = 0,.      tag =
53a0: 20 72 69 6f 74 2e 6d 6f 75 6e 74 28 27 65 76 65   riot.mount('eve
53b0: 6e 74 73 27 2c 20 7b 0a 20 20 20 20 20 20 20 20  nts', {.        
53c0: 63 62 3a 20 66 75 6e 63 74 69 6f 6e 28 65 29 20  cb: function(e) 
53d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 65  {.          expe
53e0: 63 74 28 65 2e 69 74 65 6d 2e 76 61 6c 29 2e 74  ct(e.item.val).t
53f0: 6f 2e 62 65 2e 65 71 75 61 6c 28 63 75 72 72 65  o.be.equal(curre
5400: 6e 74 49 74 65 6d 29 0a 20 20 20 20 20 20 20 20  ntItem).        
5410: 20 20 65 78 70 65 63 74 28 65 2e 69 74 65 6d 2e    expect(e.item.
5420: 69 6e 64 65 78 29 2e 74 6f 2e 62 65 2e 65 71 75  index).to.be.equ
5430: 61 6c 28 63 75 72 72 65 6e 74 49 6e 64 65 78 29  al(currentIndex)
5440: 0a 20 20 20 20 20 20 20 20 20 20 63 61 6c 6c 62  .          callb
5450: 61 63 6b 43 61 6c 6c 73 2b 2b 0a 20 20 20 20 20  ackCalls++.     
5460: 20 20 20 7d 0a 20 20 20 20 20 20 7d 29 5b 30 5d     }.      })[0]
5470: 2c 0a 20 20 20 20 20 20 64 69 76 54 61 67 73 20  ,.      divTags 
5480: 3d 20 24 24 28 27 64 69 76 27 2c 20 74 61 67 2e  = $$('div', tag.
5490: 72 6f 6f 74 29 0a 0a 20 20 20 20 63 75 72 72 65  root)..    curre
54a0: 6e 74 49 74 65 6d 20 3d 20 74 61 67 2e 69 74 65  ntItem = tag.ite
54b0: 6d 73 5b 30 5d 0a 20 20 20 20 63 75 72 72 65 6e  ms[0].    curren
54c0: 74 49 6e 64 65 78 20 3d 20 30 0a 20 20 20 20 66  tIndex = 0.    f
54d0: 69 72 65 45 76 65 6e 74 28 64 69 76 54 61 67 73  ireEvent(divTags
54e0: 5b 30 5d 2c 20 27 63 6c 69 63 6b 27 29 0a 20 20  [0], 'click').  
54f0: 20 20 74 61 67 2e 69 74 65 6d 73 2e 72 65 76 65    tag.items.reve
5500: 72 73 65 28 29 0a 20 20 20 20 74 61 67 2e 75 70  rse().    tag.up
5510: 64 61 74 65 28 29 0a 20 20 20 20 63 75 72 72 65  date().    curre
5520: 6e 74 49 74 65 6d 20 3d 20 74 61 67 2e 69 74 65  ntItem = tag.ite
5530: 6d 73 5b 30 5d 0a 20 20 20 20 63 75 72 72 65 6e  ms[0].    curren
5540: 74 49 6e 64 65 78 20 3d 20 30 0a 20 20 20 20 66  tIndex = 0.    f
5550: 69 72 65 45 76 65 6e 74 28 64 69 76 54 61 67 73  ireEvent(divTags
5560: 5b 30 5d 2c 20 27 63 6c 69 63 6b 27 29 0a 0a 20  [0], 'click').. 
5570: 20 20 20 65 78 70 65 63 74 28 63 61 6c 6c 62 61     expect(callba
5580: 63 6b 43 61 6c 6c 73 29 2e 74 6f 2e 62 65 2e 65  ckCalls).to.be.e
5590: 71 75 61 6c 28 32 29 0a 0a 20 20 20 20 74 61 67  qual(2)..    tag
55a0: 2e 75 6e 6d 6f 75 6e 74 28 29 0a 20 20 7d 29 0a  .unmount().  }).
55b0: 0a 20 20 69 74 28 27 65 76 65 6e 74 20 6c 69 73  .  it('event lis
55c0: 74 65 6e 65 72 73 20 63 61 6e 20 62 65 20 73 77  teners can be sw
55d0: 69 74 63 68 65 64 20 69 6e 20 72 75 6e 74 69 6d  itched in runtim
55e0: 65 20 77 69 74 68 6f 75 74 20 6d 65 6d 6f 72 79  e without memory
55f0: 20 6c 65 61 6b 73 27 2c 20 66 75 6e 63 74 69 6f   leaks', functio
5600: 6e 28 29 20 7b 0a 20 20 20 20 69 6e 6a 65 63 74  n() {.    inject
5610: 48 54 4d 4c 28 27 3c 72 75 6e 74 69 6d 65 2d 65  HTML('<runtime-e
5620: 76 65 6e 74 2d 6c 69 73 74 65 6e 65 72 2d 73 77  vent-listener-sw
5630: 69 74 63 68 3e 3c 2f 72 75 6e 74 69 6d 65 2d 65  itch></runtime-e
5640: 76 65 6e 74 2d 6c 69 73 74 65 6e 65 72 2d 73 77  vent-listener-sw
5650: 69 74 63 68 3e 27 29 0a 20 20 20 20 76 61 72 0a  itch>').    var.
5660: 20 20 20 20 20 20 61 72 67 73 20 3d 20 5b 5d 2c        args = [],
5670: 0a 20 20 20 20 20 20 63 62 20 3d 20 66 75 6e 63  .      cb = func
5680: 74 69 6f 6e 28 6e 61 6d 65 29 20 7b 0a 20 20 20  tion(name) {.   
5690: 20 20 20 20 20 61 72 67 73 2e 70 75 73 68 28 6e       args.push(n
56a0: 61 6d 65 29 0a 20 20 20 20 20 20 7d 2c 0a 20 20  ame).      },.  
56b0: 20 20 20 20 74 61 67 20 3d 20 72 69 6f 74 2e 6d      tag = riot.m
56c0: 6f 75 6e 74 28 27 72 75 6e 74 69 6d 65 2d 65 76  ount('runtime-ev
56d0: 65 6e 74 2d 6c 69 73 74 65 6e 65 72 2d 73 77 69  ent-listener-swi
56e0: 74 63 68 27 2c 20 7b 20 63 62 20 7d 29 5b 30 5d  tch', { cb })[0]
56f0: 2c 0a 20 20 20 20 20 20 70 46 69 72 73 74 20 3d  ,.      pFirst =
5700: 20 24 28 27 70 2e 66 69 72 73 74 27 2c 20 74 61   $('p.first', ta
5710: 67 2e 72 6f 6f 74 29 2c 0a 20 20 20 20 20 20 70  g.root),.      p
5720: 53 65 63 6f 6e 64 20 3d 20 24 28 27 70 2e 73 65  Second = $('p.se
5730: 63 6f 6e 64 27 2c 20 74 61 67 2e 72 6f 6f 74 29  cond', tag.root)
5740: 0a 0a 20 20 20 20 66 69 72 65 45 76 65 6e 74 28  ..    fireEvent(
5750: 70 46 69 72 73 74 2c 20 27 63 6c 69 63 6b 27 29  pFirst, 'click')
5760: 0a 20 20 20 20 65 78 70 65 63 74 28 61 72 67 73  .    expect(args
5770: 5b 30 5d 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c  [0]).to.be.equal
5780: 28 27 65 76 31 27 29 0a 20 20 20 20 66 69 72 65  ('ev1').    fire
5790: 45 76 65 6e 74 28 70 53 65 63 6f 6e 64 2c 20 27  Event(pSecond, '
57a0: 6d 6f 75 73 65 65 6e 74 65 72 27 29 0a 20 20 20  mouseenter').   
57b0: 20 65 78 70 65 63 74 28 61 72 67 73 5b 31 5d 29   expect(args[1])
57c0: 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27 65 76  .to.be.equal('ev
57d0: 32 27 29 0a 20 20 20 20 66 69 72 65 45 76 65 6e  2').    fireEven
57e0: 74 28 70 46 69 72 73 74 2c 20 27 63 6c 69 63 6b  t(pFirst, 'click
57f0: 27 29 0a 20 20 20 20 65 78 70 65 63 74 28 61 72  ').    expect(ar
5800: 67 73 5b 32 5d 29 2e 74 6f 2e 62 65 2e 65 71 75  gs[2]).to.be.equ
5810: 61 6c 28 27 65 76 31 27 29 0a 20 20 20 20 66 69  al('ev1').    fi
5820: 72 65 45 76 65 6e 74 28 70 46 69 72 73 74 2c 20  reEvent(pFirst, 
5830: 27 6d 6f 75 73 65 65 6e 74 65 72 27 29 0a 20 20  'mouseenter').  
5840: 20 20 65 78 70 65 63 74 28 61 72 67 73 5b 33 5d    expect(args[3]
5850: 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27 65  ).to.be.equal('e
5860: 76 32 27 29 0a 0a 20 20 20 20 65 78 70 65 63 74  v2')..    expect
5870: 28 61 72 67 73 2e 6c 65 6e 67 74 68 29 2e 74 6f  (args.length).to
5880: 2e 62 65 2e 65 71 75 61 6c 28 34 29 0a 0a 20 20  .be.equal(4)..  
5890: 20 20 74 61 67 2e 75 6e 6d 6f 75 6e 74 28 29 0a    tag.unmount().
58a0: 0a 20 20 7d 29 0a 0a 20 20 69 74 28 27 64 6f 6e  .  })..  it('don
58b0: 20 74 5c 27 20 73 6b 69 70 20 74 68 65 20 61 6e   t\' skip the an
58c0: 6f 6e 79 6d 6f 75 73 20 74 61 67 73 20 75 73 69  onymous tags usi
58d0: 6e 67 20 74 68 65 20 22 72 69 6f 74 2e 73 65 74  ng the "riot.set
58e0: 74 69 6e 67 73 2e 73 6b 69 70 41 6e 6f 6e 79 6d  tings.skipAnonym
58f0: 6f 75 73 54 61 67 73 20 3d 20 66 61 6c 73 65 22  ousTags = false"
5900: 20 6f 70 74 69 6f 6e 27 20 2c 20 66 75 6e 63 74   option' , funct
5910: 69 6f 6e 28 64 6f 6e 65 29 20 7b 0a 20 20 20 20  ion(done) {.    
5920: 72 69 6f 74 2e 73 65 74 74 69 6e 67 73 2e 73 6b  riot.settings.sk
5930: 69 70 41 6e 6f 6e 79 6d 6f 75 73 54 61 67 73 20  ipAnonymousTags 
5940: 3d 20 66 61 6c 73 65 0a 20 20 20 20 69 6e 6a 65  = false.    inje
5950: 63 74 48 54 4d 4c 28 27 3c 61 6e 6f 6e 79 6d 6f  ctHTML('<anonymo
5960: 75 73 2d 74 65 73 74 3e 3c 2f 61 6e 6f 6e 79 6d  us-test></anonym
5970: 6f 75 73 2d 74 65 73 74 3e 27 29 0a 20 20 20 20  ous-test>').    
5980: 72 69 6f 74 2e 6d 69 78 69 6e 28 7b 0a 20 20 20  riot.mixin({.   
5990: 20 20 20 69 6e 69 74 28 29 20 7b 0a 20 20 20 20     init() {.    
59a0: 20 20 20 20 69 66 20 28 74 68 69 73 2e 5f 5f 2e      if (this.__.
59b0: 69 73 41 6e 6f 6e 79 6d 6f 75 73 29 20 7b 0a 20  isAnonymous) {. 
59c0: 20 20 20 20 20 20 20 20 20 65 78 70 65 63 74 28           expect(
59d0: 74 68 69 73 2e 6f 6e 29 2e 74 6f 2e 62 65 2e 6f  this.on).to.be.o
59e0: 6b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 6e 65  k.          done
59f0: 28 29 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ().        }.   
5a00: 20 20 20 7d 0a 20 20 20 20 7d 29 0a 20 20 20 20     }.    }).    
5a10: 72 69 6f 74 2e 74 61 67 28 27 61 6e 6f 6e 79 6d  riot.tag('anonym
5a20: 6f 75 73 2d 74 65 73 74 27 2c 20 27 3c 64 69 76  ous-test', '<div
5a30: 20 65 61 63 68 3d 22 7b 20 69 74 65 6d 73 20 7d   each="{ items }
5a40: 22 3e 3c 2f 64 69 76 3e 27 2c 20 66 75 6e 63 74  "></div>', funct
5a50: 69 6f 6e 28 29 20 7b 0a 20 20 20 20 20 20 74 68  ion() {.      th
5a60: 69 73 2e 69 74 65 6d 73 20 3d 20 5b 31 5d 0a 20  is.items = [1]. 
5a70: 20 20 20 7d 29 0a 20 20 20 20 76 61 72 20 74 61     }).    var ta
5a80: 67 20 3d 20 72 69 6f 74 2e 6d 6f 75 6e 74 28 27  g = riot.mount('
5a90: 61 6e 6f 6e 79 6d 6f 75 73 2d 74 65 73 74 27 29  anonymous-test')
5aa0: 5b 30 5d 0a 20 20 20 20 74 61 67 2e 75 6e 6d 6f  [0].    tag.unmo
5ab0: 75 6e 74 28 29 0a 20 20 20 20 72 69 6f 74 2e 73  unt().    riot.s
5ac0: 65 74 74 69 6e 67 73 2e 73 6b 69 70 41 6e 6f 6e  ettings.skipAnon
5ad0: 79 6d 6f 75 73 54 61 67 73 20 3d 20 74 72 75 65  ymousTags = true
5ae0: 0a 20 20 7d 29 0a 0a 20 20 69 74 28 27 74 68 65  .  })..  it('the
5af0: 20 22 72 69 6f 74 2e 73 65 74 74 69 6e 67 73 2e   "riot.settings.
5b00: 73 6b 69 70 41 6e 6f 6e 79 6d 6f 75 73 54 61 67  skipAnonymousTag
5b10: 73 20 3d 20 66 61 6c 73 65 22 20 6f 70 74 69 6f  s = false" optio
5b20: 6e 20 77 69 6c 6c 20 6c 65 74 20 74 72 69 67 67  n will let trigg
5b30: 65 72 20 74 68 65 20 22 6d 6f 75 6e 74 22 20 65  er the "mount" e
5b40: 76 65 6e 74 20 6f 6e 20 61 6e 6f 6e 79 6d 6f 75  vent on anonymou
5b50: 73 20 74 61 67 73 27 20 2c 20 66 75 6e 63 74 69  s tags' , functi
5b60: 6f 6e 28 29 20 7b 0a 20 20 20 20 72 69 6f 74 2e  on() {.    riot.
5b70: 73 65 74 74 69 6e 67 73 2e 73 6b 69 70 41 6e 6f  settings.skipAno
5b80: 6e 79 6d 6f 75 73 54 61 67 73 20 3d 20 66 61 6c  nymousTags = fal
5b90: 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 73 70 79  se.    const spy
5ba0: 20 3d 20 73 69 6e 6f 6e 2e 73 70 79 28 29 0a 0a   = sinon.spy()..
5bb0: 20 20 20 20 69 6e 6a 65 63 74 48 54 4d 4c 28 27      injectHTML('
5bc0: 3c 72 69 6f 74 2d 74 6d 70 3e 3c 2f 72 69 6f 74  <riot-tmp></riot
5bd0: 2d 74 6d 70 3e 27 29 0a 0a 20 20 20 20 72 69 6f  -tmp>')..    rio
5be0: 74 2e 6d 69 78 69 6e 28 7b 0a 20 20 20 20 20 20  t.mixin({.      
5bf0: 69 6e 69 74 28 29 20 7b 0a 20 20 20 20 20 20 20  init() {.       
5c00: 20 74 68 69 73 2e 6f 6e 28 27 6d 6f 75 6e 74 27   this.on('mount'
5c10: 2c 20 73 70 79 29 0a 20 20 20 20 20 20 7d 0a 20  , spy).      }. 
5c20: 20 20 20 7d 29 0a 0a 20 20 20 20 72 69 6f 74 2e     })..    riot.
5c30: 74 61 67 28 27 72 69 6f 74 2d 74 6d 70 27 2c 20  tag('riot-tmp', 
5c40: 27 3c 64 69 76 20 65 61 63 68 3d 22 7b 20 69 74  '<div each="{ it
5c50: 65 6d 73 20 7d 22 3e 3c 2f 64 69 76 3e 27 2c 20  ems }"></div>', 
5c60: 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20  function() {.   
5c70: 20 20 20 74 68 69 73 2e 69 74 65 6d 73 20 3d 20     this.items = 
5c80: 5b 31 5d 0a 20 20 20 20 7d 29 0a 0a 20 20 20 20  [1].    })..    
5c90: 76 61 72 20 74 61 67 20 3d 20 72 69 6f 74 2e 6d  var tag = riot.m
5ca0: 6f 75 6e 74 28 27 72 69 6f 74 2d 74 6d 70 27 29  ount('riot-tmp')
5cb0: 5b 30 5d 0a 20 20 20 20 74 61 67 2e 75 6e 6d 6f  [0].    tag.unmo
5cc0: 75 6e 74 28 29 0a 20 20 20 20 65 78 70 65 63 74  unt().    expect
5cd0: 28 73 70 79 29 2e 74 6f 2e 68 61 76 65 2e 62 65  (spy).to.have.be
5ce0: 65 6e 2e 63 61 6c 6c 65 64 54 77 69 63 65 0a 0a  en.calledTwice..
5cf0: 20 20 20 20 72 69 6f 74 2e 73 65 74 74 69 6e 67      riot.setting
5d00: 73 2e 73 6b 69 70 41 6e 6f 6e 79 6d 6f 75 73 54  s.skipAnonymousT
5d10: 61 67 73 20 3d 20 74 72 75 65 0a 20 20 7d 29 0a  ags = true.  }).
5d20: 0a 20 20 69 74 28 27 74 68 65 20 22 75 70 64 61  .  it('the "upda
5d30: 74 65 64 22 20 65 76 65 6e 74 20 67 65 74 73 20  ted" event gets 
5d40: 70 72 6f 70 65 72 6c 79 20 74 72 69 67 67 65 72  properly trigger
5d50: 65 64 20 69 6e 20 61 20 6e 65 73 74 65 64 20 63  ed in a nested c
5d60: 68 69 6c 64 27 2c 20 66 75 6e 63 74 69 6f 6e 28  hild', function(
5d70: 64 6f 6e 65 29 20 7b 0a 20 20 20 20 69 6e 6a 65  done) {.    inje
5d80: 63 74 48 54 4d 4c 28 27 3c 64 69 76 20 69 64 3d  ctHTML('<div id=
5d90: 22 75 70 64 61 74 65 64 2d 65 76 65 6e 74 73 2d  "updated-events-
5da0: 74 65 73 74 65 72 22 3e 3c 2f 64 69 76 3e 27 29  tester"></div>')
5db0: 0a 20 20 20 20 76 61 72 20 74 61 67 20 3d 20 72  .    var tag = r
5dc0: 69 6f 74 2e 6d 6f 75 6e 74 28 27 23 75 70 64 61  iot.mount('#upda
5dd0: 74 65 64 2d 65 76 65 6e 74 73 2d 74 65 73 74 65  ted-events-teste
5de0: 72 27 2c 20 27 6e 61 6d 65 64 2d 63 68 69 6c 64  r', 'named-child
5df0: 2d 70 61 72 65 6e 74 27 29 5b 30 5d 2c 0a 20 20  -parent')[0],.  
5e00: 20 20 20 20 63 6f 75 6e 74 65 72 20 3d 20 30 0a      counter = 0.
5e10: 0a 20 20 20 20 74 61 67 2e 74 61 67 73 5b 27 6e  .    tag.tags['n
5e20: 61 6d 65 64 2d 63 68 69 6c 64 27 5d 2e 6f 6e 28  amed-child'].on(
5e30: 27 75 70 64 61 74 65 64 27 2c 20 66 75 6e 63 74  'updated', funct
5e40: 69 6f 6e 28 29 20 7b 0a 20 20 20 20 20 20 63 6f  ion() {.      co
5e50: 75 6e 74 65 72 20 2b 2b 0a 20 20 20 20 20 20 69  unter ++.      i
5e60: 66 20 28 63 6f 75 6e 74 65 72 20 3d 3d 3d 20 32  f (counter === 2
5e70: 29 20 64 6f 6e 65 28 29 0a 20 20 20 20 7d 29 0a  ) done().    }).
5e80: 0a 20 20 20 20 74 61 67 2e 75 70 64 61 74 65 28  .    tag.update(
5e90: 29 0a 20 20 20 20 74 61 67 2e 74 61 67 73 5b 27  ).    tag.tags['
5ea0: 6e 61 6d 65 64 2d 63 68 69 6c 64 27 5d 2e 75 70  named-child'].up
5eb0: 64 61 74 65 28 29 0a 0a 20 20 20 20 74 61 67 2e  date()..    tag.
5ec0: 75 6e 6d 6f 75 6e 74 28 29 0a 0a 20 20 7d 29 0a  unmount()..  }).
5ed0: 0a 20 20 69 74 28 27 6f 6e 6c 79 20 65 76 61 6c  .  it('only eval
5ee0: 75 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73  utes expressions
5ef0: 20 6f 6e 63 65 20 70 65 72 20 75 70 64 61 74 65   once per update
5f00: 27 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a  ', function() {.
5f10: 0a 20 20 20 20 69 6e 6a 65 63 74 48 54 4d 4c 28  .    injectHTML(
5f20: 27 3c 65 78 70 72 65 73 73 69 6f 6e 2d 65 76 61  '<expression-eva
5f30: 6c 2d 63 6f 75 6e 74 3e 3c 2f 65 78 70 72 65 73  l-count></expres
5f40: 73 69 6f 6e 2d 65 76 61 6c 2d 63 6f 75 6e 74 3e  sion-eval-count>
5f50: 27 29 0a 0a 20 20 20 20 76 61 72 20 74 61 67 20  ')..    var tag 
5f60: 3d 20 72 69 6f 74 2e 6d 6f 75 6e 74 28 27 65 78  = riot.mount('ex
5f70: 70 72 65 73 73 69 6f 6e 2d 65 76 61 6c 2d 63 6f  pression-eval-co
5f80: 75 6e 74 27 29 5b 30 5d 0a 20 20 20 20 65 78 70  unt')[0].    exp
5f90: 65 63 74 28 74 61 67 2e 63 6f 75 6e 74 29 2e 74  ect(tag.count).t
5fa0: 6f 2e 62 65 2e 65 71 75 61 6c 28 31 29 0a 20 20  o.be.equal(1).  
5fb0: 20 20 74 61 67 2e 75 70 64 61 74 65 28 29 0a 20    tag.update(). 
5fc0: 20 20 20 65 78 70 65 63 74 28 74 61 67 2e 63 6f     expect(tag.co
5fd0: 75 6e 74 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c  unt).to.be.equal
5fe0: 28 32 29 0a 20 20 20 20 74 61 67 2e 75 6e 6d 6f  (2).    tag.unmo
5ff0: 75 6e 74 28 29 0a 20 20 7d 29 0a 0a 20 20 69 74  unt().  })..  it
6000: 28 27 6d 75 6c 74 69 20 72 65 66 65 72 65 6e 63  ('multi referenc
6010: 65 64 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 61  ed elements to a
6020: 6e 20 61 72 72 61 79 27 2c 20 66 75 6e 63 74 69  n array', functi
6030: 6f 6e 28 29 20 7b 0a 0a 20 20 20 20 69 6e 6a 65  on() {..    inje
6040: 63 74 48 54 4d 4c 28 27 3c 6d 75 6c 74 69 2d 6e  ctHTML('<multi-n
6050: 61 6d 65 64 3e 3c 2f 6d 75 6c 74 69 2d 6e 61 6d  amed></multi-nam
6060: 65 64 3e 27 29 0a 0a 20 20 20 20 76 61 72 20 6d  ed>')..    var m
6070: 6f 75 6e 74 20 3d 20 66 75 6e 63 74 69 6f 6e 28  ount = function(
6080: 29 20 7b 0a 20 20 20 20 20 20 20 20 76 61 72 20  ) {.        var 
6090: 74 61 67 20 3d 20 74 68 69 73 0a 20 20 20 20 20  tag = this.     
60a0: 20 20 20 65 78 70 65 63 74 28 74 61 67 2e 72 65     expect(tag.re
60b0: 66 73 2e 72 61 64 5b 30 5d 2e 76 61 6c 75 65 29  fs.rad[0].value)
60c0: 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27 31 27  .to.be.equal('1'
60d0: 29 0a 20 20 20 20 20 20 20 20 65 78 70 65 63 74  ).        expect
60e0: 28 74 61 67 2e 72 65 66 73 2e 72 61 64 5b 31 5d  (tag.refs.rad[1]
60f0: 2e 76 61 6c 75 65 29 2e 74 6f 2e 62 65 2e 65 71  .value).to.be.eq
6100: 75 61 6c 28 27 32 27 29 0a 20 20 20 20 20 20 20  ual('2').       
6110: 20 65 78 70 65 63 74 28 74 61 67 2e 72 65 66 73   expect(tag.refs
6120: 2e 72 61 64 5b 32 5d 2e 76 61 6c 75 65 29 2e 74  .rad[2].value).t
6130: 6f 2e 62 65 2e 65 71 75 61 6c 28 27 33 27 29 0a  o.be.equal('3').
6140: 20 20 20 20 20 20 20 20 65 78 70 65 63 74 28 74          expect(t
6150: 61 67 2e 72 65 66 73 2e 74 2e 76 61 6c 75 65 29  ag.refs.t.value)
6160: 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27 31 27  .to.be.equal('1'
6170: 29 0a 20 20 20 20 20 20 20 20 65 78 70 65 63 74  ).        expect
6180: 28 74 61 67 2e 72 65 66 73 2e 74 5f 31 2e 76 61  (tag.refs.t_1.va
6190: 6c 75 65 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c  lue).to.be.equal
61a0: 28 27 31 27 29 0a 20 20 20 20 20 20 20 20 65 78  ('1').        ex
61b0: 70 65 63 74 28 74 61 67 2e 72 65 66 73 2e 74 5f  pect(tag.refs.t_
61c0: 32 2e 76 61 6c 75 65 29 2e 74 6f 2e 62 65 2e 65  2.value).to.be.e
61d0: 71 75 61 6c 28 27 32 27 29 0a 20 20 20 20 20 20  qual('2').      
61e0: 20 20 65 78 70 65 63 74 28 74 61 67 2e 72 65 66    expect(tag.ref
61f0: 73 2e 63 5b 30 5d 2e 76 61 6c 75 65 29 2e 74 6f  s.c[0].value).to
6200: 2e 62 65 2e 65 71 75 61 6c 28 27 31 27 29 0a 20  .be.equal('1'). 
6210: 20 20 20 20 20 20 20 65 78 70 65 63 74 28 74 61         expect(ta
6220: 67 2e 72 65 66 73 2e 63 5b 31 5d 2e 76 61 6c 75  g.refs.c[1].valu
6230: 65 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27  e).to.be.equal('
6240: 32 27 29 0a 20 20 20 20 20 20 7d 2c 0a 20 20 20  2').      },.   
6250: 20 20 20 6d 6f 75 6e 74 43 68 69 6c 64 20 3d 20     mountChild = 
6260: 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20  function() {.   
6270: 20 20 20 20 20 76 61 72 20 74 61 67 20 3d 20 74       var tag = t
6280: 68 69 73 0a 20 20 20 20 20 20 20 20 65 78 70 65  his.        expe
6290: 63 74 28 74 61 67 2e 72 65 66 73 2e 63 68 69 6c  ct(tag.refs.chil
62a0: 64 2e 76 61 6c 75 65 29 2e 74 6f 2e 62 65 2e 65  d.value).to.be.e
62b0: 71 75 61 6c 28 27 63 68 69 6c 64 27 29 0a 20 20  qual('child').  
62c0: 20 20 20 20 20 20 65 78 70 65 63 74 28 74 61 67        expect(tag
62d0: 2e 72 65 66 73 2e 63 68 65 63 6b 5b 30 5d 2e 76  .refs.check[0].v
62e0: 61 6c 75 65 29 2e 74 6f 2e 62 65 2e 65 71 75 61  alue).to.be.equa
62f0: 6c 28 27 6f 6e 65 27 29 0a 20 20 20 20 20 20 20  l('one').       
6300: 20 65 78 70 65 63 74 28 74 61 67 2e 72 65 66 73   expect(tag.refs
6310: 2e 63 68 65 63 6b 5b 31 5d 2e 76 61 6c 75 65 29  .check[1].value)
6320: 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27 74 77  .to.be.equal('tw
6330: 6f 27 29 0a 20 20 20 20 20 20 20 20 65 78 70 65  o').        expe
6340: 63 74 28 74 61 67 2e 72 65 66 73 2e 63 68 65 63  ct(tag.refs.chec
6350: 6b 5b 32 5d 2e 76 61 6c 75 65 29 2e 74 6f 2e 62  k[2].value).to.b
6360: 65 2e 65 71 75 61 6c 28 27 74 68 72 65 65 27 29  e.equal('three')
6370: 0a 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 76 61  ..      }.    va
6380: 72 20 74 61 67 20 3d 20 72 69 6f 74 2e 6d 6f 75  r tag = riot.mou
6390: 6e 74 28 27 6d 75 6c 74 69 2d 6e 61 6d 65 64 27  nt('multi-named'
63a0: 2c 20 7b 20 6d 6f 75 6e 74 3a 20 6d 6f 75 6e 74  , { mount: mount
63b0: 2c 20 6d 6f 75 6e 74 43 68 69 6c 64 3a 20 6d 6f  , mountChild: mo
63c0: 75 6e 74 43 68 69 6c 64 20 7d 29 5b 30 5d 0a 0a  untChild })[0]..
63d0: 20 20 20 20 74 61 67 2e 75 6e 6d 6f 75 6e 74 28      tag.unmount(
63e0: 29 0a 20 20 7d 29 0a 0a 0a 20 20 69 74 28 27 69  ).  })...  it('i
63f0: 6e 70 75 74 20 74 79 70 65 3d 6e 75 6d 62 65 72  nput type=number
6400: 27 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a  ', function() {.
6410: 0a 20 20 20 20 69 6e 6a 65 63 74 48 54 4d 4c 28  .    injectHTML(
6420: 27 3c 69 6e 70 75 74 2d 6e 75 6d 62 65 72 3e 3c  '<input-number><
6430: 2f 69 6e 70 75 74 2d 6e 75 6d 62 65 72 3e 27 29  /input-number>')
6440: 0a 0a 20 20 20 20 76 61 72 20 74 61 67 20 3d 20  ..    var tag = 
6450: 72 69 6f 74 2e 6d 6f 75 6e 74 28 27 69 6e 70 75  riot.mount('inpu
6460: 74 2d 6e 75 6d 62 65 72 27 2c 20 7b 6e 75 6d 3a  t-number', {num:
6470: 20 31 32 33 7d 29 5b 30 5d 0a 20 20 20 20 76 61   123})[0].    va
6480: 72 20 69 6e 70 20 3d 20 24 28 27 69 6e 70 75 74  r inp = $('input
6490: 27 2c 20 74 61 67 2e 72 6f 6f 74 29 0a 20 20 20  ', tag.root).   
64a0: 20 65 78 70 65 63 74 28 69 6e 70 2e 67 65 74 41   expect(inp.getA
64b0: 74 74 72 69 62 75 74 65 28 27 74 79 70 65 27 29  ttribute('type')
64c0: 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27 6e  ).to.be.equal('n
64d0: 75 6d 62 65 72 27 29 0a 20 20 20 20 65 78 70 65  umber').    expe
64e0: 63 74 28 69 6e 70 2e 76 61 6c 75 65 29 2e 74 6f  ct(inp.value).to
64f0: 2e 62 65 2e 65 71 75 61 6c 28 27 31 32 33 27 29  .be.equal('123')
6500: 0a 0a 20 20 20 20 74 61 67 20 3d 20 72 69 6f 74  ..    tag = riot
6510: 2e 6d 6f 75 6e 74 28 27 69 6e 70 75 74 2d 6e 75  .mount('input-nu
6520: 6d 62 65 72 27 2c 20 7b 6e 75 6d 3a 20 30 7d 29  mber', {num: 0})
6530: 5b 30 5d 0a 20 20 20 20 69 6e 70 20 3d 20 24 28  [0].    inp = $(
6540: 27 69 6e 70 75 74 27 2c 20 74 61 67 2e 72 6f 6f  'input', tag.roo
6550: 74 29 0a 20 20 20 20 65 78 70 65 63 74 28 69 6e  t).    expect(in
6560: 70 2e 67 65 74 41 74 74 72 69 62 75 74 65 28 27  p.getAttribute('
6570: 74 79 70 65 27 29 29 2e 74 6f 2e 62 65 2e 65 71  type')).to.be.eq
6580: 75 61 6c 28 27 6e 75 6d 62 65 72 27 29 0a 20 20  ual('number').  
6590: 20 20 65 78 70 65 63 74 28 69 6e 70 2e 76 61 6c    expect(inp.val
65a0: 75 65 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28  ue).to.be.equal(
65b0: 27 30 27 29 0a 0a 20 20 20 20 74 61 67 20 3d 20  '0')..    tag = 
65c0: 72 69 6f 74 2e 6d 6f 75 6e 74 28 27 69 6e 70 75  riot.mount('inpu
65d0: 74 2d 6e 75 6d 62 65 72 27 2c 20 7b 6e 75 6d 3a  t-number', {num:
65e0: 20 6e 75 6c 6c 7d 29 5b 30 5d 0a 20 20 20 20 69   null})[0].    i
65f0: 6e 70 20 3d 20 24 28 27 69 6e 70 75 74 27 2c 20  np = $('input', 
6600: 74 61 67 2e 72 6f 6f 74 29 0a 20 20 20 20 65 78  tag.root).    ex
6610: 70 65 63 74 28 69 6e 70 2e 67 65 74 41 74 74 72  pect(inp.getAttr
6620: 69 62 75 74 65 28 27 74 79 70 65 27 29 29 2e 74  ibute('type')).t
6630: 6f 2e 62 65 2e 65 71 75 61 6c 28 27 6e 75 6d 62  o.be.equal('numb
6640: 65 72 27 29 0a 20 20 20 20 65 78 70 65 63 74 28  er').    expect(
6650: 69 6e 70 2e 76 61 6c 75 65 29 2e 74 6f 2e 62 65  inp.value).to.be
6660: 2e 65 71 75 61 6c 28 27 27 29 0a 0a 20 20 20 20  .equal('')..    
6670: 74 61 67 2e 75 6e 6d 6f 75 6e 74 28 29 0a 0a 20  tag.unmount().. 
6680: 20 7d 29 0a 0a 20 20 69 74 28 27 74 68 65 20 69   })..  it('the i
6690: 6e 70 75 74 20 76 61 6c 75 65 73 20 73 68 6f 75  nput values shou
66a0: 6c 64 20 62 65 20 75 70 64 61 74 65 64 20 63 6f  ld be updated co
66b0: 72 65 63 74 6c 79 20 6f 6e 20 61 6e 79 20 75 70  rectly on any up
66c0: 64 61 74 65 20 63 61 6c 6c 27 2c 20 66 75 6e 63  date call', func
66d0: 74 69 6f 6e 28 29 20 7b 0a 0a 20 20 20 20 69 6e  tion() {..    in
66e0: 6a 65 63 74 48 54 4d 4c 28 27 3c 69 6e 70 75 74  jectHTML('<input
66f0: 2d 76 61 6c 75 65 73 3e 3c 2f 69 6e 70 75 74 2d  -values></input-
6700: 76 61 6c 75 65 73 3e 27 29 0a 0a 20 20 20 20 76  values>')..    v
6710: 61 72 20 74 61 67 20 3d 20 72 69 6f 74 2e 6d 6f  ar tag = riot.mo
6720: 75 6e 74 28 27 69 6e 70 75 74 2d 76 61 6c 75 65  unt('input-value
6730: 73 27 29 5b 30 5d 0a 20 20 20 20 65 78 70 65 63  s')[0].    expec
6740: 74 28 74 61 67 2e 72 65 66 73 2e 69 2e 76 61 6c  t(tag.refs.i.val
6750: 75 65 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28  ue).to.be.equal(
6760: 27 68 69 27 29 0a 20 20 20 20 74 61 67 2e 75 70  'hi').    tag.up
6770: 64 61 74 65 28 29 0a 20 20 20 20 65 78 70 65 63  date().    expec
6780: 74 28 74 61 67 2e 72 65 66 73 2e 69 2e 76 61 6c  t(tag.refs.i.val
6790: 75 65 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28  ue).to.be.equal(
67a0: 27 66 6f 6f 27 29 0a 0a 20 20 20 20 74 61 67 2e  'foo')..    tag.
67b0: 75 6e 6d 6f 75 6e 74 28 29 0a 20 20 7d 29 0a 0a  unmount().  })..
67c0: 20 20 69 74 28 27 63 61 72 72 6f 74 20 70 6f 73    it('carrot pos
67d0: 69 74 69 6f 6e 20 69 73 20 70 72 65 73 65 72 76  ition is preserv
67e0: 65 64 20 77 68 65 6e 20 69 6e 70 75 74 20 69 73  ed when input is
67f0: 20 73 61 6d 65 20 61 73 20 63 61 6c 63 75 6c 61   same as calcula
6800: 74 65 64 20 76 61 6c 75 65 27 2c 20 66 75 6e 63  ted value', func
6810: 74 69 6f 6e 28 29 20 7b 0a 0a 20 20 20 20 69 6e  tion() {..    in
6820: 6a 65 63 74 48 54 4d 4c 28 27 3c 69 6e 70 75 74  jectHTML('<input
6830: 2d 76 61 6c 75 65 73 3e 3c 2f 69 6e 70 75 74 2d  -values></input-
6840: 76 61 6c 75 65 73 3e 27 29 0a 0a 20 20 20 20 76  values>')..    v
6850: 61 72 20 74 61 67 20 3d 20 72 69 6f 74 2e 6d 6f  ar tag = riot.mo
6860: 75 6e 74 28 27 69 6e 70 75 74 2d 76 61 6c 75 65  unt('input-value
6870: 73 27 29 5b 30 5d 0a 0a 20 20 20 20 76 61 72 20  s')[0]..    var 
6880: 6e 65 77 56 61 6c 75 65 20 3d 20 27 73 6f 6d 65  newValue = 'some
6890: 20 6e 65 77 20 74 65 78 74 27 0a 20 20 20 20 74   new text'.    t
68a0: 61 67 2e 72 65 66 73 2e 69 2e 76 61 6c 75 65 20  ag.refs.i.value 
68b0: 3d 20 6e 65 77 56 61 6c 75 65 0a 20 20 20 20 74  = newValue.    t
68c0: 61 67 2e 72 65 66 73 2e 69 2e 66 6f 63 75 73 28  ag.refs.i.focus(
68d0: 29 0a 20 20 20 20 73 65 74 43 61 72 72 6f 74 50  ).    setCarrotP
68e0: 6f 73 28 74 61 67 2e 72 65 66 73 2e 69 2c 20 34  os(tag.refs.i, 4
68f0: 29 0a 0a 20 20 20 20 74 61 67 2e 6d 65 73 73 61  )..    tag.messa
6900: 67 65 20 3d 20 6e 65 77 56 61 6c 75 65 0a 20 20  ge = newValue.  
6910: 20 20 74 61 67 2e 75 70 64 61 74 65 28 29 0a 0a    tag.update()..
6920: 20 20 20 20 65 78 70 65 63 74 28 67 65 74 43 61      expect(getCa
6930: 72 72 6f 74 50 6f 73 28 74 61 67 2e 72 65 66 73  rrotPos(tag.refs
6940: 2e 69 29 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c  .i)).to.be.equal
6950: 28 34 29 0a 0a 20 20 20 20 74 61 67 2e 75 6e 6d  (4)..    tag.unm
6960: 6f 75 6e 74 28 29 0a 20 20 7d 29 0a 0a 20 20 69  ount().  })..  i
6970: 74 28 27 64 6f 65 73 20 6e 6f 74 20 73 65 74 20  t('does not set 
6980: 76 61 6c 75 65 20 61 74 74 72 69 62 75 74 65 27  value attribute'
6990: 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 0a  , function() {..
69a0: 20 20 20 20 69 6e 6a 65 63 74 48 54 4d 4c 28 27      injectHTML('
69b0: 3c 69 6e 70 75 74 2d 76 61 6c 75 65 73 3e 3c 2f  <input-values></
69c0: 69 6e 70 75 74 2d 76 61 6c 75 65 73 3e 27 29 0a  input-values>').
69d0: 0a 20 20 20 20 76 61 72 20 74 61 67 20 3d 20 72  .    var tag = r
69e0: 69 6f 74 2e 6d 6f 75 6e 74 28 27 69 6e 70 75 74  iot.mount('input
69f0: 2d 76 61 6c 75 65 73 27 29 5b 30 5d 0a 20 20 20  -values')[0].   
6a00: 20 65 78 70 65 63 74 28 74 61 67 2e 72 65 66 73   expect(tag.refs
6a10: 2e 69 2e 76 61 6c 75 65 29 2e 74 6f 2e 62 65 2e  .i.value).to.be.
6a20: 65 71 75 61 6c 28 27 68 69 27 29 0a 20 20 20 20  equal('hi').    
6a30: 65 78 70 65 63 74 28 74 61 67 2e 72 65 66 73 2e  expect(tag.refs.
6a40: 69 2e 68 61 73 41 74 74 72 69 62 75 74 65 28 27  i.hasAttribute('
6a50: 76 61 6c 75 65 27 29 29 2e 74 6f 2e 62 65 2e 66  value')).to.be.f
6a60: 61 6c 73 65 0a 20 20 20 20 74 61 67 2e 75 70 64  alse.    tag.upd
6a70: 61 74 65 28 29 0a 20 20 20 20 65 78 70 65 63 74  ate().    expect
6a80: 28 74 61 67 2e 72 65 66 73 2e 69 2e 76 61 6c 75  (tag.refs.i.valu
6a90: 65 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27  e).to.be.equal('
6aa0: 66 6f 6f 27 29 0a 20 20 20 20 65 78 70 65 63 74  foo').    expect
6ab0: 28 74 61 67 2e 72 65 66 73 2e 69 2e 68 61 73 41  (tag.refs.i.hasA
6ac0: 74 74 72 69 62 75 74 65 28 27 76 61 6c 75 65 27  ttribute('value'
6ad0: 29 29 2e 74 6f 2e 62 65 2e 66 61 6c 73 65 0a 0a  )).to.be.false..
6ae0: 20 20 20 20 74 61 67 2e 75 6e 6d 6f 75 6e 74 28      tag.unmount(
6af0: 29 0a 20 20 7d 29 0a 0a 20 20 69 74 28 27 75 70  ).  })..  it('up
6b00: 64 61 74 65 73 20 74 68 65 20 76 61 6c 75 65 20  dates the value 
6b10: 6f 66 20 69 6e 70 75 74 20 77 68 69 63 68 20 68  of input which h
6b20: 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20  as been changed 
6b30: 66 72 6f 6d 20 69 6e 69 74 69 61 6c 20 6f 6e 65  from initial one
6b40: 20 23 32 30 39 36 27 2c 20 66 75 6e 63 74 69 6f   #2096', functio
6b50: 6e 28 29 20 7b 0a 0a 20 20 20 20 69 6e 6a 65 63  n() {..    injec
6b60: 74 48 54 4d 4c 28 27 3c 69 6e 70 75 74 2d 75 70  tHTML('<input-up
6b70: 64 61 74 65 64 3e 3c 2f 69 6e 70 75 74 2d 75 70  dated></input-up
6b80: 64 61 74 65 64 3e 27 29 0a 0a 20 20 20 20 76 61  dated>')..    va
6b90: 72 20 74 61 67 20 3d 20 72 69 6f 74 2e 6d 6f 75  r tag = riot.mou
6ba0: 6e 74 28 27 69 6e 70 75 74 2d 75 70 64 61 74 65  nt('input-update
6bb0: 64 27 29 5b 30 5d 0a 20 20 20 20 65 78 70 65 63  d')[0].    expec
6bc0: 74 28 74 61 67 2e 72 65 66 73 2e 69 2e 76 61 6c  t(tag.refs.i.val
6bd0: 75 65 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28  ue).to.be.equal(
6be0: 27 48 65 6c 6c 6f 2c 20 52 69 6f 74 21 27 29 0a  'Hello, Riot!').
6bf0: 20 20 20 20 74 61 67 2e 72 65 66 73 2e 69 2e 76      tag.refs.i.v
6c00: 61 6c 75 65 20 3d 20 27 48 69 21 27 0a 20 20 20  alue = 'Hi!'.   
6c10: 20 66 69 72 65 45 76 65 6e 74 28 74 61 67 2e 72   fireEvent(tag.r
6c20: 65 66 73 2e 62 2c 20 27 63 6c 69 63 6b 27 29 0a  efs.b, 'click').
6c30: 20 20 20 20 65 78 70 65 63 74 28 74 61 67 2e 72      expect(tag.r
6c40: 65 66 73 2e 69 2e 76 61 6c 75 65 29 2e 74 6f 2e  efs.i.value).to.
6c50: 62 65 2e 65 71 75 61 6c 28 27 43 61 6e 20 79 6f  be.equal('Can yo
6c60: 75 20 68 65 61 72 20 6d 65 3f 27 29 0a 0a 20 20  u hear me?')..  
6c70: 20 20 74 61 67 2e 75 6e 6d 6f 75 6e 74 28 29 0a    tag.unmount().
6c80: 20 20 7d 29 0a 0a 20 20 69 74 28 27 66 61 69 6c    })..  it('fail
6c90: 73 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  s to update the 
6ca0: 76 61 6c 75 65 20 6f 66 20 69 6e 70 75 74 20 77  value of input w
6cb0: 68 69 63 68 20 68 61 73 20 74 68 65 20 73 61 6d  hich has the sam
6cc0: 65 20 69 6e 74 65 72 6e 61 6c 20 76 61 6c 75 65  e internal value
6cd0: 20 23 31 36 34 32 20 23 32 31 31 32 27 2c 20 66   #1642 #2112', f
6ce0: 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 0a 20 20 20  unction() {..   
6cf0: 20 69 6e 6a 65 63 74 48 54 4d 4c 28 27 3c 69 6e   injectHTML('<in
6d00: 70 75 74 2d 75 70 64 61 74 65 64 3e 3c 2f 69 6e  put-updated></in
6d10: 70 75 74 2d 75 70 64 61 74 65 64 3e 27 29 0a 0a  put-updated>')..
6d20: 20 20 20 20 76 61 72 20 74 61 67 20 3d 20 72 69      var tag = ri
6d30: 6f 74 2e 6d 6f 75 6e 74 28 27 69 6e 70 75 74 2d  ot.mount('input-
6d40: 75 70 64 61 74 65 64 27 29 5b 30 5d 0a 20 20 20  updated')[0].   
6d50: 20 66 69 72 65 45 76 65 6e 74 28 74 61 67 2e 72   fireEvent(tag.r
6d60: 65 66 73 2e 62 2c 20 27 63 6c 69 63 6b 27 29 0a  efs.b, 'click').
6d70: 20 20 20 20 65 78 70 65 63 74 28 74 61 67 2e 72      expect(tag.r
6d80: 65 66 73 2e 69 2e 76 61 6c 75 65 29 2e 74 6f 2e  efs.i.value).to.
6d90: 62 65 2e 65 71 75 61 6c 28 27 43 61 6e 20 79 6f  be.equal('Can yo
6da0: 75 20 68 65 61 72 20 6d 65 3f 27 29 0a 0a 20 20  u hear me?')..  
6db0: 20 20 74 61 67 2e 72 65 66 73 2e 69 2e 76 61 6c    tag.refs.i.val
6dc0: 75 65 20 3d 20 27 59 65 61 68 2e 27 0a 20 20 20  ue = 'Yeah.'.   
6dd0: 20 66 69 72 65 45 76 65 6e 74 28 74 61 67 2e 72   fireEvent(tag.r
6de0: 65 66 73 2e 62 2c 20 27 63 6c 69 63 6b 27 29 0a  efs.b, 'click').
6df0: 20 20 20 20 65 78 70 65 63 74 28 74 61 67 2e 72      expect(tag.r
6e00: 65 66 73 2e 69 2e 76 61 6c 75 65 29 2e 6e 6f 74  efs.i.value).not
6e10: 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27 43 61  .to.be.equal('Ca
6e20: 6e 20 79 6f 75 20 68 65 61 72 20 6d 65 3f 27 29  n you hear me?')
6e30: 0a 20 20 20 20 2f 2f 20 49 54 20 4d 41 59 20 53  .    // IT MAY S
6e40: 45 45 4d 20 57 45 49 52 44 20 41 54 20 46 49 52  EEM WEIRD AT FIR
6e50: 53 54 2c 20 42 55 54 20 54 48 49 53 20 49 53 20  ST, BUT THIS IS 
6e60: 53 50 45 43 2e 0a 20 20 20 20 2f 2f 20 53 65 65  SPEC..    // See
6e70: 20 6d 6f 72 65 20 64 65 74 61 69 6c 20 6f 6e 20   more detail on 
6e80: 23 31 36 34 32 0a 0a 20 20 20 20 74 61 67 2e 75  #1642..    tag.u
6e90: 6e 6d 6f 75 6e 74 28 29 0a 20 20 7d 29 0a 0a 20  nmount().  }).. 
6ea0: 20 69 74 28 27 72 65 63 75 72 73 69 76 65 20 73   it('recursive s
6eb0: 74 72 75 63 74 75 72 65 27 2c 20 66 75 6e 63 74  tructure', funct
6ec0: 69 6f 6e 28 29 20 7b 0a 20 20 20 20 69 6e 6a 65  ion() {.    inje
6ed0: 63 74 48 54 4d 4c 28 27 3c 74 72 65 65 76 69 65  ctHTML('<treevie
6ee0: 77 3e 3c 2f 74 72 65 65 76 69 65 77 3e 27 29 0a  w></treeview>').
6ef0: 20 20 20 20 76 61 72 20 74 61 67 20 3d 20 72 69      var tag = ri
6f00: 6f 74 2e 6d 6f 75 6e 74 28 27 74 72 65 65 76 69  ot.mount('treevi
6f10: 65 77 27 29 5b 30 5d 0a 20 20 20 20 65 78 70 65  ew')[0].    expe
6f20: 63 74 28 74 61 67 29 2e 74 6f 2e 62 65 2e 61 6e  ct(tag).to.be.an
6f30: 28 27 6f 62 6a 65 63 74 27 29 0a 20 20 20 20 65  ('object').    e
6f40: 78 70 65 63 74 28 74 61 67 2e 69 73 4d 6f 75 6e  xpect(tag.isMoun
6f50: 74 65 64 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c  ted).to.be.equal
6f60: 28 74 72 75 65 29 0a 20 20 20 20 74 61 67 2e 75  (true).    tag.u
6f70: 6e 6d 6f 75 6e 74 28 29 0a 20 20 7d 29 0a 0a 20  nmount().  }).. 
6f80: 20 69 74 28 27 74 6f 70 20 6d 6f 73 74 20 74 61   it('top most ta
6f90: 67 20 70 72 65 73 65 72 76 65 20 61 74 74 72 69  g preserve attri
6fa0: 62 75 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73  bute expressions
6fb0: 27 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a  ', function() {.
6fc0: 20 20 20 20 69 6e 6a 65 63 74 48 54 4d 4c 28 27      injectHTML('
6fd0: 3c 74 6f 70 2d 61 74 74 72 69 62 75 74 65 73 20  <top-attributes 
6fe0: 63 6c 73 3d 22 63 6c 61 73 73 79 22 3e 3c 2f 74  cls="classy"></t
6ff0: 6f 70 2d 61 74 74 72 69 62 75 74 65 73 3e 27 29  op-attributes>')
7000: 0a 20 20 20 20 76 61 72 20 74 61 67 20 3d 20 72  .    var tag = r
7010: 69 6f 74 2e 6d 6f 75 6e 74 28 27 74 6f 70 2d 61  iot.mount('top-a
7020: 74 74 72 69 62 75 74 65 73 27 29 5b 30 5d 0a 20  ttributes')[0]. 
7030: 20 20 20 65 78 70 65 63 74 28 74 61 67 2e 72 6f     expect(tag.ro
7040: 6f 74 2e 63 6c 61 73 73 4e 61 6d 65 29 2e 74 6f  ot.className).to
7050: 2e 62 65 2e 65 71 75 61 6c 28 27 63 6c 61 73 73  .be.equal('class
7060: 79 27 29 20 2f 2f 20 71 6f 75 74 65 64 0a 20 20  y') // qouted.  
7070: 20 20 65 78 70 65 63 74 28 74 61 67 2e 72 6f 6f    expect(tag.roo
7080: 74 2e 67 65 74 41 74 74 72 69 62 75 74 65 28 27  t.getAttribute('
7090: 64 61 74 61 2d 6e 6f 71 75 6f 74 65 27 29 29 2e  data-noquote')).
70a0: 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27 71 75 6f  to.be.equal('quo
70b0: 74 65 73 27 29 20 2f 2f 20 6e 6f 74 20 71 75 6f  tes') // not quo
70c0: 74 65 64 0a 20 20 20 20 65 78 70 65 63 74 28 74  ted.    expect(t
70d0: 61 67 2e 72 6f 6f 74 2e 67 65 74 41 74 74 72 69  ag.root.getAttri
70e0: 62 75 74 65 28 27 64 61 74 61 2d 6e 71 6c 61 73  bute('data-nqlas
70f0: 74 27 29 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c  t')).to.be.equal
7100: 28 27 71 75 6f 74 65 73 27 29 20 2f 2f 20 6c 61  ('quotes') // la
7110: 73 74 20 61 74 74 72 20 77 69 74 68 20 6e 6f 20  st attr with no 
7120: 71 75 6f 74 65 73 0a 20 20 20 20 65 78 70 65 63  quotes.    expec
7130: 74 28 74 61 67 2e 72 6f 6f 74 2e 73 74 79 6c 65  t(tag.root.style
7140: 2e 66 6f 6e 74 53 69 7a 65 29 2e 74 6f 2e 62 65  .fontSize).to.be
7150: 2e 65 71 75 61 6c 28 27 32 65 6d 27 29 20 2f 2f  .equal('2em') //
7160: 20 54 4f 44 4f 3a 20 68 6f 77 20 74 6f 20 74 65   TODO: how to te
7170: 73 74 20 72 69 6f 74 2d 70 72 65 66 69 78 3f 0a  st riot-prefix?.
7180: 20 20 20 20 74 61 67 2e 75 6e 6d 6f 75 6e 74 28      tag.unmount(
7190: 29 0a 20 20 7d 29 0a 0a 20 20 69 74 28 27 63 61  ).  })..  it('ca
71a0: 6d 65 6c 69 7a 65 20 74 68 65 20 6f 70 74 69 6f  melize the optio
71b0: 6e 73 20 70 61 73 73 65 64 20 76 69 61 20 64 6f  ns passed via do
71c0: 6d 20 61 74 74 72 69 62 75 74 65 73 27 2c 20 66  m attributes', f
71d0: 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20  unction() {.    
71e0: 69 6e 6a 65 63 74 48 54 4d 4c 28 27 3c 74 6f 70  injectHTML('<top
71f0: 2d 61 74 74 72 69 62 75 74 65 73 3e 3c 2f 74 6f  -attributes></to
7200: 70 2d 61 74 74 72 69 62 75 74 65 73 3e 27 29 0a  p-attributes>').
7210: 20 20 20 20 76 61 72 20 6e 6f 64 65 20 3d 20 64      var node = d
7220: 6f 63 75 6d 65 6e 74 2e 63 72 65 61 74 65 45 6c  ocument.createEl
7230: 65 6d 65 6e 74 28 27 74 6f 70 2d 61 74 74 72 69  ement('top-attri
7240: 62 75 74 65 73 27 29 2c 0a 20 20 20 20 20 20 74  butes'),.      t
7250: 61 67 0a 0a 20 20 20 20 6e 6f 64 65 2e 73 65 74  ag..    node.set
7260: 41 74 74 72 69 62 75 74 65 28 27 6d 79 2d 72 61  Attribute('my-ra
7270: 6e 64 6f 6d 2d 61 74 74 72 69 62 75 74 65 27 2c  ndom-attribute',
7280: 20 27 68 65 6c 6c 6f 27 29 0a 20 20 20 20 74 61   'hello').    ta
7290: 67 20 3d 20 72 69 6f 74 2e 6d 6f 75 6e 74 28 6e  g = riot.mount(n
72a0: 6f 64 65 2c 20 7b 0a 20 20 20 20 20 20 27 61 6e  ode, {.      'an
72b0: 6f 74 68 65 72 2d 72 61 6e 64 6f 6d 2d 6f 70 74  other-random-opt
72c0: 69 6f 6e 27 3a 20 27 68 65 6c 6c 6f 27 0a 20 20  ion': 'hello'.  
72d0: 20 20 7d 29 5b 30 5d 0a 20 20 20 20 65 78 70 65    })[0].    expe
72e0: 63 74 28 74 61 67 2e 6f 70 74 73 2e 6d 79 52 61  ct(tag.opts.myRa
72f0: 6e 64 6f 6d 41 74 74 72 69 62 75 74 65 29 2e 74  ndomAttribute).t
7300: 6f 2e 62 65 2e 65 71 75 61 6c 28 27 68 65 6c 6c  o.be.equal('hell
7310: 6f 27 29 0a 20 20 20 20 65 78 70 65 63 74 28 74  o').    expect(t
7320: 61 67 2e 6f 70 74 73 5b 27 61 6e 6f 74 68 65 72  ag.opts['another
7330: 2d 72 61 6e 64 6f 6d 2d 6f 70 74 69 6f 6e 27 5d  -random-option']
7340: 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27 68  ).to.be.equal('h
7350: 65 6c 6c 6f 27 29 0a 0a 20 20 20 20 74 61 67 2e  ello')..    tag.
7360: 75 6e 6d 6f 75 6e 74 28 29 0a 20 20 7d 29 0a 0a  unmount().  })..
7370: 20 20 69 74 28 27 6f 70 74 73 20 63 6f 75 6c 64    it('opts could
7380: 20 62 65 20 61 6c 73 6f 20 61 6e 20 6f 62 73 65   be also an obse
7390: 72 76 61 62 6c 65 20 6f 62 6a 65 63 74 20 28 69  rvable object (i
73a0: 73 73 75 65 20 32 35 38 31 29 27 2c 20 66 75 6e  ssue 2581)', fun
73b0: 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20 69 6e  ction() {.    in
73c0: 6a 65 63 74 48 54 4d 4c 28 27 3c 72 69 6f 74 2d  jectHTML('<riot-
73d0: 74 6d 70 3e 3c 2f 72 69 6f 74 2d 74 6d 70 3e 27  tmp></riot-tmp>'
73e0: 29 0a 20 20 20 20 72 69 6f 74 2e 74 61 67 28 27  ).    riot.tag('
73f0: 72 69 6f 74 2d 74 6d 70 27 2c 20 27 3c 70 3e 68  riot-tmp', '<p>h
7400: 65 6c 6c 6f 3c 2f 70 3e 27 29 0a 20 20 20 20 63  ello</p>').    c
7410: 6f 6e 73 74 20 5b 74 61 67 5d 20 3d 20 72 69 6f  onst [tag] = rio
7420: 74 2e 6d 6f 75 6e 74 28 27 72 69 6f 74 2d 74 6d  t.mount('riot-tm
7430: 70 27 2c 20 72 69 6f 74 2e 6f 62 73 65 72 76 61  p', riot.observa
7440: 62 6c 65 28 29 29 0a 0a 20 20 20 20 65 78 70 65  ble())..    expe
7450: 63 74 28 74 61 67 2e 6f 70 74 73 2e 6f 6e 29 2e  ct(tag.opts.on).
7460: 74 6f 2e 62 65 2e 6f 6b 0a 20 20 20 20 74 61 67  to.be.ok.    tag
7470: 2e 75 6e 6d 6f 75 6e 74 28 29 0a 20 20 7d 29 0a  .unmount().  }).
7480: 0a 20 20 69 74 28 27 65 78 70 72 65 73 73 69 6f  .  it('expressio
7490: 6e 73 20 6f 62 6a 65 63 74 20 61 74 74 72 69 62  ns object attrib
74a0: 75 74 65 73 20 67 65 74 20 72 65 6d 6f 76 65 64  utes get removed
74b0: 20 6f 6e 63 65 20 75 73 65 64 27 2c 20 66 75 6e   once used', fun
74c0: 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20 69 6e  ction() {.    in
74d0: 6a 65 63 74 48 54 4d 4c 28 27 3c 74 6f 70 2d 61  jectHTML('<top-a
74e0: 74 74 72 69 62 75 74 65 73 3e 3c 2f 74 6f 70 2d  ttributes></top-
74f0: 61 74 74 72 69 62 75 74 65 73 3e 27 29 0a 20 20  attributes>').  
7500: 20 20 76 61 72 20 6e 6f 64 65 20 3d 20 64 6f 63    var node = doc
7510: 75 6d 65 6e 74 2e 63 72 65 61 74 65 45 6c 65 6d  ument.createElem
7520: 65 6e 74 28 27 74 6f 70 2d 61 74 74 72 69 62 75  ent('top-attribu
7530: 74 65 73 27 29 2c 0a 20 20 20 20 20 20 74 61 67  tes'),.      tag
7540: 0a 0a 20 20 20 20 6e 6f 64 65 2e 73 65 74 41 74  ..    node.setAt
7550: 74 72 69 62 75 74 65 28 27 64 61 74 61 27 2c 20  tribute('data', 
7560: 27 7b 20 6f 70 74 73 20 7d 27 29 0a 20 20 20 20  '{ opts }').    
7570: 74 61 67 20 3d 20 72 69 6f 74 2e 6d 6f 75 6e 74  tag = riot.mount
7580: 28 6e 6f 64 65 2c 20 7b 20 6d 65 73 73 61 67 65  (node, { message
7590: 3a 20 27 68 65 6c 6c 6f 27 20 7d 29 5b 30 5d 0a  : 'hello' })[0].
75a0: 20 20 20 20 65 78 70 65 63 74 28 74 61 67 2e 6f      expect(tag.o
75b0: 70 74 73 2e 64 61 74 61 2e 6d 65 73 73 61 67 65  pts.data.message
75c0: 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27 68  ).to.be.equal('h
75d0: 65 6c 6c 6f 27 29 0a 20 20 20 20 65 78 70 65 63  ello').    expec
75e0: 74 28 74 61 67 2e 72 6f 6f 74 2e 67 65 74 41 74  t(tag.root.getAt
75f0: 74 72 69 62 75 74 65 28 27 64 61 74 61 27 29 29  tribute('data'))
7600: 2e 74 6f 2e 62 65 2e 6e 6f 74 2e 6f 6b 0a 0a 20  .to.be.not.ok.. 
7610: 20 20 20 74 61 67 2e 75 6e 6d 6f 75 6e 74 28 29     tag.unmount()
7620: 0a 20 20 7d 29 0a 0a 0a 20 20 69 74 28 27 74 68  .  })...  it('th
7630: 65 20 22 73 68 6f 75 6c 64 55 70 64 61 74 65 22  e "shouldUpdate"
7640: 20 6c 6f 63 6b 73 20 74 68 65 20 74 61 67 20 75   locks the tag u
7650: 70 64 61 74 65 20 70 72 6f 70 65 72 6c 79 27 2c  pdate properly',
7660: 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20 20   function() {.  
7670: 20 20 69 6e 6a 65 63 74 48 54 4d 4c 28 27 3c 73    injectHTML('<s
7680: 68 6f 75 6c 64 2d 75 70 64 61 74 65 3e 3c 2f 73  hould-update></s
7690: 68 6f 75 6c 64 2d 75 70 64 61 74 65 3e 27 29 0a  hould-update>').
76a0: 20 20 20 20 76 61 72 20 74 61 67 20 3d 20 72 69      var tag = ri
76b0: 6f 74 2e 6d 6f 75 6e 74 28 27 73 68 6f 75 6c 64  ot.mount('should
76c0: 2d 75 70 64 61 74 65 27 29 5b 30 5d 0a 20 20 20  -update')[0].   
76d0: 20 65 78 70 65 63 74 28 74 61 67 2e 75 70 64 61   expect(tag.upda
76e0: 74 65 28 29 29 2e 74 6f 2e 62 65 2e 6f 6b 0a 20  te()).to.be.ok. 
76f0: 20 20 20 65 78 70 65 63 74 28 74 61 67 2e 72 65     expect(tag.re
7700: 66 73 2e 63 6f 75 6e 74 2e 69 6e 6e 65 72 48 54  fs.count.innerHT
7710: 4d 4c 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28  ML).to.be.equal(
7720: 27 30 27 29 0a 20 20 20 20 65 78 70 65 63 74 28  '0').    expect(
7730: 74 61 67 2e 63 6f 75 6e 74 29 2e 74 6f 2e 62 65  tag.count).to.be
7740: 2e 65 71 75 61 6c 28 30 29 0a 20 20 20 20 74 61  .equal(0).    ta
7750: 67 2e 75 70 64 61 74 65 28 74 72 75 65 29 0a 20  g.update(true). 
7760: 20 20 20 65 78 70 65 63 74 28 74 61 67 2e 63 6f     expect(tag.co
7770: 75 6e 74 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c  unt).to.be.equal
7780: 28 31 29 0a 20 20 20 20 74 61 67 2e 75 6e 6d 6f  (1).    tag.unmo
7790: 75 6e 74 28 29 0a 20 20 7d 29 0a 0a 20 20 69 74  unt().  })..  it
77a0: 28 27 74 68 65 20 22 73 68 6f 75 6c 64 55 70 64  ('the "shouldUpd
77b0: 61 74 65 22 20 61 63 63 65 70 74 73 20 6e 65 78  ate" accepts nex
77c0: 74 4f 70 74 73 27 2c 20 66 75 6e 63 74 69 6f 6e  tOpts', function
77d0: 28 29 20 7b 0a 20 20 20 20 69 6e 6a 65 63 74 48  () {.    injectH
77e0: 54 4d 4c 28 27 3c 73 68 6f 75 6c 64 2d 75 70 64  TML('<should-upd
77f0: 61 74 65 2d 6f 70 74 73 20 73 68 6f 75 6c 64 2d  ate-opts should-
7800: 75 70 64 61 74 65 3d 22 7b 20 63 6f 75 6e 74 20  update="{ count 
7810: 3d 3d 3d 20 30 20 7d 22 3e 3c 2f 73 68 6f 75 6c  === 0 }"></shoul
7820: 64 2d 75 70 64 61 74 65 2d 6f 70 74 73 3e 27 29  d-update-opts>')
7830: 0a 20 20 20 20 76 61 72 20 74 61 67 20 3d 20 72  .    var tag = r
7840: 69 6f 74 2e 6d 6f 75 6e 74 28 27 73 68 6f 75 6c  iot.mount('shoul
7850: 64 2d 75 70 64 61 74 65 2d 6f 70 74 73 27 29 5b  d-update-opts')[
7860: 30 5d 0a 20 20 20 20 65 78 70 65 63 74 28 74 61  0].    expect(ta
7870: 67 2e 75 70 64 61 74 65 28 29 29 2e 74 6f 2e 62  g.update()).to.b
7880: 65 2e 6f 6b 0a 20 20 20 20 65 78 70 65 63 74 28  e.ok.    expect(
7890: 74 61 67 2e 63 6f 75 6e 74 29 2e 74 6f 2e 62 65  tag.count).to.be
78a0: 2e 65 71 75 61 6c 28 31 29 0a 20 20 20 20 74 61  .equal(1).    ta
78b0: 67 2e 75 70 64 61 74 65 28 29 0a 20 20 20 20 65  g.update().    e
78c0: 78 70 65 63 74 28 74 61 67 2e 63 6f 75 6e 74 29  xpect(tag.count)
78d0: 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 31 29 0a  .to.be.equal(1).
78e0: 20 20 20 20 74 61 67 2e 75 6e 6d 6f 75 6e 74 28      tag.unmount(
78f0: 29 0a 20 20 7d 29 0a 0a 20 20 69 74 28 27 61 6c  ).  })..  it('al
7900: 6c 6f 77 20 70 61 73 73 69 6e 67 20 72 69 6f 74  low passing riot
7910: 2e 6f 62 73 65 72 76 61 6c 65 20 69 6e 73 74 61  .observale insta
7920: 6e 63 65 73 20 74 6f 20 74 68 65 20 63 68 69 6c  nces to the chil
7930: 64 72 65 6e 20 74 61 67 73 27 2c 20 66 75 6e 63  dren tags', func
7940: 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20 69 6e 6a  tion() {.    inj
7950: 65 63 74 48 54 4d 4c 28 27 3c 6f 62 73 65 72 76  ectHTML('<observ
7960: 61 62 6c 65 2d 61 74 74 72 3e 3c 2f 6f 62 73 65  able-attr></obse
7970: 72 76 61 62 6c 65 2d 61 74 74 72 3e 27 29 0a 20  rvable-attr>'). 
7980: 20 20 20 76 61 72 20 74 61 67 20 3d 20 72 69 6f     var tag = rio
7990: 74 2e 6d 6f 75 6e 74 28 27 6f 62 73 65 72 76 61  t.mount('observa
79a0: 62 6c 65 2d 61 74 74 72 27 29 5b 30 5d 0a 20 20  ble-attr')[0].  
79b0: 20 20 65 78 70 65 63 74 28 74 61 67 2e 74 61 67    expect(tag.tag
79c0: 73 5b 27 6f 62 73 65 72 76 61 62 6c 65 2d 61 74  s['observable-at
79d0: 74 72 2d 63 68 69 6c 64 27 5d 2e 77 61 73 54 72  tr-child'].wasTr
79e0: 69 67 67 65 72 65 64 29 2e 74 6f 2e 62 65 2e 65  iggered).to.be.e
79f0: 71 75 61 6c 28 74 72 75 65 29 0a 20 20 20 20 74  qual(true).    t
7a00: 61 67 2e 75 6e 6d 6f 75 6e 74 28 29 0a 20 20 7d  ag.unmount().  }
7a10: 29 0a 0a 20 20 69 74 28 27 6e 65 73 74 65 64 20  )..  it('nested 
7a20: 76 69 72 74 75 61 6c 20 74 61 67 73 20 75 6e 6d  virtual tags unm
7a30: 6f 75 6e 74 20 70 72 6f 70 65 72 6c 79 27 2c 20  ount properly', 
7a40: 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20  function() {.   
7a50: 20 69 6e 6a 65 63 74 48 54 4d 4c 28 27 3c 76 69   injectHTML('<vi
7a60: 72 74 75 61 6c 2d 6e 65 73 74 65 64 2d 75 6e 6d  rtual-nested-unm
7a70: 6f 75 6e 74 3e 3c 2f 76 69 72 74 75 61 6c 2d 6e  ount></virtual-n
7a80: 65 73 74 65 64 2d 75 6e 6d 6f 75 6e 74 3e 27 29  ested-unmount>')
7a90: 0a 20 20 20 20 76 61 72 20 74 61 67 20 3d 20 72  .    var tag = r
7aa0: 69 6f 74 2e 6d 6f 75 6e 74 28 27 76 69 72 74 75  iot.mount('virtu
7ab0: 61 6c 2d 6e 65 73 74 65 64 2d 75 6e 6d 6f 75 6e  al-nested-unmoun
7ac0: 74 27 29 5b 30 5d 0a 20 20 20 20 76 61 72 20 73  t')[0].    var s
7ad0: 70 61 6e 73 20 3d 20 24 24 28 27 73 70 61 6e 27  pans = $$('span'
7ae0: 2c 20 74 61 67 2e 72 6f 6f 74 29 0a 20 20 20 20  , tag.root).    
7af0: 76 61 72 20 64 69 76 73 20 3d 20 24 24 28 27 64  var divs = $$('d
7b00: 69 76 27 2c 20 74 61 67 2e 72 6f 6f 74 29 0a 20  iv', tag.root). 
7b10: 20 20 20 65 78 70 65 63 74 28 73 70 61 6e 73 2e     expect(spans.
7b20: 6c 65 6e 67 74 68 29 2e 74 6f 2e 62 65 2e 65 71  length).to.be.eq
7b30: 75 61 6c 28 36 29 0a 20 20 20 20 65 78 70 65 63  ual(6).    expec
7b40: 74 28 64 69 76 73 2e 6c 65 6e 67 74 68 29 2e 74  t(divs.length).t
7b50: 6f 2e 62 65 2e 65 71 75 61 6c 28 33 29 0a 20 20  o.be.equal(3).  
7b60: 20 20 65 78 70 65 63 74 28 73 70 61 6e 73 5b 30    expect(spans[0
7b70: 5d 2e 69 6e 6e 65 72 48 54 4d 4c 29 2e 74 6f 2e  ].innerHTML).to.
7b80: 62 65 2e 65 71 75 61 6c 28 27 31 27 29 0a 20 20  be.equal('1').  
7b90: 20 20 65 78 70 65 63 74 28 73 70 61 6e 73 5b 31    expect(spans[1
7ba0: 5d 2e 69 6e 6e 65 72 48 54 4d 4c 29 2e 74 6f 2e  ].innerHTML).to.
7bb0: 62 65 2e 65 71 75 61 6c 28 27 31 27 29 0a 20 20  be.equal('1').  
7bc0: 20 20 65 78 70 65 63 74 28 73 70 61 6e 73 5b 32    expect(spans[2
7bd0: 5d 2e 69 6e 6e 65 72 48 54 4d 4c 29 2e 74 6f 2e  ].innerHTML).to.
7be0: 62 65 2e 65 71 75 61 6c 28 27 32 27 29 0a 20 20  be.equal('2').  
7bf0: 20 20 65 78 70 65 63 74 28 73 70 61 6e 73 5b 33    expect(spans[3
7c00: 5d 2e 69 6e 6e 65 72 48 54 4d 4c 29 2e 74 6f 2e  ].innerHTML).to.
7c10: 62 65 2e 65 71 75 61 6c 28 27 31 27 29 0a 20 20  be.equal('1').  
7c20: 20 20 65 78 70 65 63 74 28 73 70 61 6e 73 5b 34    expect(spans[4
7c30: 5d 2e 69 6e 6e 65 72 48 54 4d 4c 29 2e 74 6f 2e  ].innerHTML).to.
7c40: 62 65 2e 65 71 75 61 6c 28 27 32 27 29 0a 20 20  be.equal('2').  
7c50: 20 20 65 78 70 65 63 74 28 73 70 61 6e 73 5b 35    expect(spans[5
7c60: 5d 2e 69 6e 6e 65 72 48 54 4d 4c 29 2e 74 6f 2e  ].innerHTML).to.
7c70: 62 65 2e 65 71 75 61 6c 28 27 33 27 29 0a 20 20  be.equal('3').  
7c80: 20 20 65 78 70 65 63 74 28 64 69 76 73 5b 30 5d    expect(divs[0]
7c90: 2e 69 6e 6e 65 72 48 54 4d 4c 29 2e 74 6f 2e 62  .innerHTML).to.b
7ca0: 65 2e 65 71 75 61 6c 28 27 31 27 29 0a 20 20 20  e.equal('1').   
7cb0: 20 65 78 70 65 63 74 28 64 69 76 73 5b 31 5d 2e   expect(divs[1].
7cc0: 69 6e 6e 65 72 48 54 4d 4c 29 2e 74 6f 2e 62 65  innerHTML).to.be
7cd0: 2e 65 71 75 61 6c 28 27 32 27 29 0a 20 20 20 20  .equal('2').    
7ce0: 65 78 70 65 63 74 28 64 69 76 73 5b 32 5d 2e 69  expect(divs[2].i
7cf0: 6e 6e 65 72 48 54 4d 4c 29 2e 74 6f 2e 62 65 2e  nnerHTML).to.be.
7d00: 65 71 75 61 6c 28 27 33 27 29 0a 0a 20 20 20 20  equal('3')..    
7d10: 74 61 67 2e 63 68 69 6c 64 49 74 65 6d 73 20 3d  tag.childItems =
7d20: 20 5b 0a 20 20 20 20 20 20 7b 74 69 74 6c 65 3a   [.      {title:
7d30: 20 27 34 27 2c 20 63 68 69 6c 64 63 68 69 6c 64   '4', childchild
7d40: 49 74 65 6d 73 3a 20 5b 27 31 27 2c 20 27 32 27  Items: ['1', '2'
7d50: 2c 20 27 33 27 2c 20 27 34 27 5d 7d 2c 0a 20 20  , '3', '4']},.  
7d60: 20 20 20 20 7b 74 69 74 6c 65 3a 20 27 35 27 2c      {title: '5',
7d70: 20 63 68 69 6c 64 63 68 69 6c 64 49 74 65 6d 73   childchildItems
7d80: 3a 20 5b 27 31 27 2c 20 27 32 27 2c 20 27 33 27  : ['1', '2', '3'
7d90: 2c 20 27 34 27 2c 20 27 35 27 5d 7d 0a 20 20 20  , '4', '5']}.   
7da0: 20 5d 0a 20 20 20 20 74 61 67 2e 75 70 64 61 74   ].    tag.updat
7db0: 65 28 29 0a 20 20 20 20 73 70 61 6e 73 20 3d 20  e().    spans = 
7dc0: 24 24 28 27 73 70 61 6e 27 2c 20 74 61 67 2e 72  $$('span', tag.r
7dd0: 6f 6f 74 29 0a 20 20 20 20 64 69 76 73 20 3d 20  oot).    divs = 
7de0: 24 24 28 27 64 69 76 27 2c 20 74 61 67 2e 72 6f  $$('div', tag.ro
7df0: 6f 74 29 0a 20 20 20 20 65 78 70 65 63 74 28 73  ot).    expect(s
7e00: 70 61 6e 73 2e 6c 65 6e 67 74 68 29 2e 74 6f 2e  pans.length).to.
7e10: 62 65 2e 65 71 75 61 6c 28 39 29 0a 20 20 20 20  be.equal(9).    
7e20: 65 78 70 65 63 74 28 64 69 76 73 2e 6c 65 6e 67  expect(divs.leng
7e30: 74 68 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28  th).to.be.equal(
7e40: 32 29 0a 20 20 20 20 65 78 70 65 63 74 28 73 70  2).    expect(sp
7e50: 61 6e 73 5b 30 5d 2e 69 6e 6e 65 72 48 54 4d 4c  ans[0].innerHTML
7e60: 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27 31  ).to.be.equal('1
7e70: 27 29 0a 20 20 20 20 65 78 70 65 63 74 28 73 70  ').    expect(sp
7e80: 61 6e 73 5b 31 5d 2e 69 6e 6e 65 72 48 54 4d 4c  ans[1].innerHTML
7e90: 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27 32  ).to.be.equal('2
7ea0: 27 29 0a 20 20 20 20 65 78 70 65 63 74 28 73 70  ').    expect(sp
7eb0: 61 6e 73 5b 32 5d 2e 69 6e 6e 65 72 48 54 4d 4c  ans[2].innerHTML
7ec0: 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27 33  ).to.be.equal('3
7ed0: 27 29 0a 20 20 20 20 65 78 70 65 63 74 28 73 70  ').    expect(sp
7ee0: 61 6e 73 5b 33 5d 2e 69 6e 6e 65 72 48 54 4d 4c  ans[3].innerHTML
7ef0: 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27 34  ).to.be.equal('4
7f00: 27 29 0a 20 20 20 20 65 78 70 65 63 74 28 73 70  ').    expect(sp
7f10: 61 6e 73 5b 34 5d 2e 69 6e 6e 65 72 48 54 4d 4c  ans[4].innerHTML
7f20: 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27 31  ).to.be.equal('1
7f30: 27 29 0a 20 20 20 20 65 78 70 65 63 74 28 73 70  ').    expect(sp
7f40: 61 6e 73 5b 35 5d 2e 69 6e 6e 65 72 48 54 4d 4c  ans[5].innerHTML
7f50: 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27 32  ).to.be.equal('2
7f60: 27 29 0a 20 20 20 20 65 78 70 65 63 74 28 73 70  ').    expect(sp
7f70: 61 6e 73 5b 36 5d 2e 69 6e 6e 65 72 48 54 4d 4c  ans[6].innerHTML
7f80: 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27 33  ).to.be.equal('3
7f90: 27 29 0a 20 20 20 20 65 78 70 65 63 74 28 73 70  ').    expect(sp
7fa0: 61 6e 73 5b 37 5d 2e 69 6e 6e 65 72 48 54 4d 4c  ans[7].innerHTML
7fb0: 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27 34  ).to.be.equal('4
7fc0: 27 29 0a 20 20 20 20 65 78 70 65 63 74 28 73 70  ').    expect(sp
7fd0: 61 6e 73 5b 38 5d 2e 69 6e 6e 65 72 48 54 4d 4c  ans[8].innerHTML
7fe0: 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27 35  ).to.be.equal('5
7ff0: 27 29 0a 20 20 20 20 65 78 70 65 63 74 28 64 69  ').    expect(di
8000: 76 73 5b 30 5d 2e 69 6e 6e 65 72 48 54 4d 4c 29  vs[0].innerHTML)
8010: 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27 34 27  .to.be.equal('4'
8020: 29 0a 20 20 20 20 65 78 70 65 63 74 28 64 69 76  ).    expect(div
8030: 73 5b 31 5d 2e 69 6e 6e 65 72 48 54 4d 4c 29 2e  s[1].innerHTML).
8040: 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27 35 27 29  to.be.equal('5')
8050: 0a 0a 20 20 20 20 74 61 67 2e 75 6e 6d 6f 75 6e  ..    tag.unmoun
8060: 74 28 29 0a 20 20 7d 29 0a 0a 20 20 69 74 28 27  t().  })..  it('
8070: 72 65 6e 64 65 72 20 74 61 67 3a 20 69 6e 70 75  render tag: inpu
8080: 74 2c 6f 70 74 69 6f 6e 2c 74 65 78 74 61 72 65  t,option,textare
8090: 61 20 74 61 67 73 20 68 61 76 69 6e 67 20 65 78  a tags having ex
80a0: 70 72 65 73 73 69 6f 6e 73 20 61 73 20 76 61 6c  pressions as val
80b0: 75 65 27 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20  ue', function() 
80c0: 7b 0a 20 20 20 20 69 6e 6a 65 63 74 48 54 4d 4c  {.    injectHTML
80d0: 28 27 3c 66 6f 72 6d 2d 63 6f 6e 74 72 6f 6c 73  ('<form-controls
80e0: 3e 3c 2f 66 6f 72 6d 2d 63 6f 6e 74 72 6f 6c 73  ></form-controls
80f0: 3e 27 29 0a 20 20 20 20 76 61 72 20 76 61 6c 20  >').    var val 
8100: 3d 20 27 6d 79 2d 76 61 6c 75 65 27 2c 0a 20 20  = 'my-value',.  
8110: 20 20 20 20 74 61 67 20 3d 20 72 69 6f 74 2e 6d      tag = riot.m
8120: 6f 75 6e 74 28 27 66 6f 72 6d 2d 63 6f 6e 74 72  ount('form-contr
8130: 6f 6c 73 27 2c 20 7b 20 74 65 78 74 3a 20 76 61  ols', { text: va
8140: 6c 20 7d 29 5b 30 5d 2c 0a 20 20 20 20 20 20 72  l })[0],.      r
8150: 6f 6f 74 20 3d 20 74 61 67 2e 72 6f 6f 74 0a 0a  oot = tag.root..
8160: 20 20 20 20 65 78 70 65 63 74 28 24 28 27 69 6e      expect($('in
8170: 70 75 74 5b 74 79 70 65 3d 22 74 65 78 74 22 5d  put[type="text"]
8180: 27 2c 20 72 6f 6f 74 29 2e 76 61 6c 75 65 29 2e  ', root).value).
8190: 74 6f 2e 62 65 2e 65 71 75 61 6c 28 76 61 6c 29  to.be.equal(val)
81a0: 0a 20 20 20 20 65 78 70 65 63 74 28 24 28 27 73  .    expect($('s
81b0: 65 6c 65 63 74 20 6f 70 74 69 6f 6e 5b 73 65 6c  elect option[sel
81c0: 65 63 74 65 64 5d 27 2c 20 72 6f 6f 74 29 2e 76  ected]', root).v
81d0: 61 6c 75 65 29 2e 74 6f 2e 62 65 2e 65 71 75 61  alue).to.be.equa
81e0: 6c 28 76 61 6c 29 0a 20 20 20 20 65 78 70 65 63  l(val).    expec
81f0: 74 28 24 28 27 74 65 78 74 61 72 65 61 5b 6e 61  t($('textarea[na
8200: 6d 65 3d 22 74 78 74 61 31 22 5d 27 2c 20 72 6f  me="txta1"]', ro
8210: 6f 74 29 2e 76 61 6c 75 65 29 2e 74 6f 2e 62 65  ot).value).to.be
8220: 2e 65 71 75 61 6c 28 76 61 6c 29 0a 20 20 20 20  .equal(val).    
8230: 65 78 70 65 63 74 28 24 28 27 74 65 78 74 61 72  expect($('textar
8240: 65 61 5b 6e 61 6d 65 3d 22 74 78 74 61 32 22 5d  ea[name="txta2"]
8250: 27 2c 20 72 6f 6f 74 29 2e 76 61 6c 75 65 29 2e  ', root).value).
8260: 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27 27 29 0a  to.be.equal('').
8270: 20 20 20 20 69 66 20 28 49 45 5f 56 45 52 53 49      if (IE_VERSI
8280: 4f 4e 20 21 3d 3d 20 39 29 20 65 78 70 65 63 74  ON !== 9) expect
8290: 28 24 28 27 74 65 78 74 61 72 65 61 5b 6e 61 6d  ($('textarea[nam
82a0: 65 3d 22 74 78 74 61 32 22 5d 27 2c 20 72 6f 6f  e="txta2"]', roo
82b0: 74 29 2e 70 6c 61 63 65 68 6f 6c 64 65 72 29 2e  t).placeholder).
82c0: 74 6f 2e 62 65 2e 65 71 75 61 6c 28 76 61 6c 29  to.be.equal(val)
82d0: 0a 0a 20 20 20 20 74 61 67 2e 75 6e 6d 6f 75 6e  ..    tag.unmoun
82e0: 74 28 29 0a 20 20 7d 29 0a 0a 20 20 69 74 28 27  t().  })..  it('
82f0: 6d 75 6c 74 69 70 6c 65 20 73 65 6c 65 63 74 20  multiple select 
8300: 77 69 6c 6c 20 62 65 20 70 72 6f 70 65 72 6c 79  will be properly
8310: 20 72 65 6e 64 65 72 65 64 27 2c 20 66 75 6e 63   rendered', func
8320: 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20 69 6e 6a  tion() {.    inj
8330: 65 63 74 48 54 4d 4c 28 27 3c 6d 75 6c 74 69 70  ectHTML('<multip
8340: 6c 65 2d 73 65 6c 65 63 74 3e 3c 2f 6d 75 6c 74  le-select></mult
8350: 69 70 6c 65 2d 73 65 6c 65 63 74 3e 27 29 0a 20  iple-select>'). 
8360: 20 20 20 63 6f 6e 73 74 20 74 61 67 20 3d 20 72     const tag = r
8370: 69 6f 74 2e 6d 6f 75 6e 74 28 27 6d 75 6c 74 69  iot.mount('multi
8380: 70 6c 65 2d 73 65 6c 65 63 74 27 29 5b 30 5d 0a  ple-select')[0].
8390: 20 20 20 20 63 6f 6e 73 74 20 76 61 6c 75 65 73      const values
83a0: 20 3d 20 5b 5d 0a 20 20 20 20 3b 5b 5d 2e 66 6f   = [].    ;[].fo
83b0: 72 45 61 63 68 2e 63 61 6c 6c 28 74 61 67 2e 72  rEach.call(tag.r
83c0: 65 66 73 2e 73 65 6c 2e 6f 70 74 69 6f 6e 73 2c  efs.sel.options,
83d0: 20 66 75 6e 63 74 69 6f 6e 28 6f 70 74 69 6f 6e   function(option
83e0: 29 20 7b 0a 20 20 20 20 20 20 69 66 20 28 6f 70  ) {.      if (op
83f0: 74 69 6f 6e 2e 73 65 6c 65 63 74 65 64 29 20 76  tion.selected) v
8400: 61 6c 75 65 73 2e 70 75 73 68 28 6f 70 74 69 6f  alues.push(optio
8410: 6e 2e 76 61 6c 75 65 29 0a 20 20 20 20 7d 29 0a  n.value).    }).
8420: 20 20 20 20 65 78 70 65 63 74 28 76 61 6c 75 65      expect(value
8430: 73 29 2e 74 6f 2e 68 61 76 65 2e 6c 65 6e 67 74  s).to.have.lengt
8440: 68 28 32 29 0a 20 20 20 20 74 61 67 2e 75 6e 6d  h(2).    tag.unm
8450: 6f 75 6e 74 28 29 0a 20 20 7d 29 0a 0a 0a 20 20  ount().  })...  
8460: 69 74 28 27 63 6f 6d 70 6f 6e 65 6e 74 20 6e 65  it('component ne
8470: 73 74 65 64 20 69 6e 20 76 69 72 74 75 61 6c 20  sted in virtual 
8480: 75 6e 6d 6f 75 6e 74 73 20 63 6f 72 72 65 63 74  unmounts correct
8490: 6c 79 27 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20  ly', function() 
84a0: 7b 0a 20 20 20 20 69 6e 6a 65 63 74 48 54 4d 4c  {.    injectHTML
84b0: 28 27 3c 76 69 72 74 75 61 6c 2d 6e 65 73 74 65  ('<virtual-neste
84c0: 64 2d 63 6f 6d 70 6f 6e 65 6e 74 3e 3c 2f 76 69  d-component></vi
84d0: 72 74 75 61 6c 2d 6e 65 73 74 65 64 2d 63 6f 6d  rtual-nested-com
84e0: 70 6f 6e 65 6e 74 3e 27 29 0a 20 20 20 20 76 61  ponent>').    va
84f0: 72 20 74 61 67 20 3d 20 72 69 6f 74 2e 6d 6f 75  r tag = riot.mou
8500: 6e 74 28 27 76 69 72 74 75 61 6c 2d 6e 65 73 74  nt('virtual-nest
8510: 65 64 2d 63 6f 6d 70 6f 6e 65 6e 74 27 29 5b 30  ed-component')[0
8520: 5d 0a 20 20 20 20 76 61 72 20 63 6f 6d 70 6f 6e  ].    var compon
8530: 65 6e 74 73 20 3d 20 24 24 28 27 6e 6f 74 2d 76  ents = $$('not-v
8540: 69 72 74 75 61 6c 2d 63 6f 6d 70 6f 6e 65 6e 74  irtual-component
8550: 32 27 2c 20 74 61 67 2e 72 6f 6f 74 29 0a 0a 20  2', tag.root).. 
8560: 20 20 20 65 78 70 65 63 74 28 63 6f 6d 70 6f 6e     expect(compon
8570: 65 6e 74 73 2e 6c 65 6e 67 74 68 29 2e 74 6f 2e  ents.length).to.
8580: 62 65 2e 65 71 75 61 6c 28 34 29 0a 20 20 20 20  be.equal(4).    
8590: 65 78 70 65 63 74 28 74 61 67 2e 74 61 67 73 5b  expect(tag.tags[
85a0: 27 6e 6f 74 2d 76 69 72 74 75 61 6c 2d 63 6f 6d  'not-virtual-com
85b0: 70 6f 6e 65 6e 74 32 27 5d 29 2e 74 6f 2e 68 61  ponent2']).to.ha
85c0: 76 65 2e 6c 65 6e 67 74 68 28 34 29 0a 0a 20 20  ve.length(4)..  
85d0: 20 20 74 61 67 2e 70 65 6f 70 6c 65 2e 70 6f 70    tag.people.pop
85e0: 28 29 0a 20 20 20 20 74 61 67 2e 75 70 64 61 74  ().    tag.updat
85f0: 65 28 29 0a 0a 20 20 20 20 63 6f 6d 70 6f 6e 65  e()..    compone
8600: 6e 74 73 20 3d 20 24 24 28 27 6e 6f 74 2d 76 69  nts = $$('not-vi
8610: 72 74 75 61 6c 2d 63 6f 6d 70 6f 6e 65 6e 74 32  rtual-component2
8620: 27 2c 20 74 61 67 2e 72 6f 6f 74 29 0a 20 20 20  ', tag.root).   
8630: 20 65 78 70 65 63 74 28 63 6f 6d 70 6f 6e 65 6e   expect(componen
8640: 74 73 2e 6c 65 6e 67 74 68 29 2e 74 6f 2e 62 65  ts.length).to.be
8650: 2e 65 71 75 61 6c 28 33 29 0a 20 20 20 20 65 78  .equal(3).    ex
8660: 70 65 63 74 28 74 61 67 2e 74 61 67 73 5b 27 6e  pect(tag.tags['n
8670: 6f 74 2d 76 69 72 74 75 61 6c 2d 63 6f 6d 70 6f  ot-virtual-compo
8680: 6e 65 6e 74 32 27 5d 29 2e 74 6f 2e 68 61 76 65  nent2']).to.have
8690: 2e 6c 65 6e 67 74 68 28 33 29 0a 0a 20 20 20 20  .length(3)..    
86a0: 74 61 67 2e 75 6e 6d 6f 75 6e 74 28 29 0a 0a 20  tag.unmount().. 
86b0: 20 20 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 3d 20     components = 
86c0: 24 24 28 27 6e 6f 74 2d 76 69 72 74 75 61 6c 2d  $$('not-virtual-
86d0: 63 6f 6d 70 6f 6e 65 6e 74 32 27 2c 20 74 61 67  component2', tag
86e0: 2e 72 6f 6f 74 29 0a 20 20 20 20 65 78 70 65 63  .root).    expec
86f0: 74 28 63 6f 6d 70 6f 6e 65 6e 74 73 2e 6c 65 6e  t(components.len
8700: 67 74 68 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c  gth).to.be.equal
8710: 28 30 29 0a 20 20 7d 29 0a 0a 20 20 69 74 28 27  (0).  })..  it('
8720: 65 76 65 6e 74 20 68 61 6e 64 6c 65 72 20 6f 6e  event handler on
8730: 20 65 61 63 68 20 63 75 73 74 6f 6d 20 74 61 67   each custom tag
8740: 20 64 6f 65 73 6e 74 20 75 70 64 61 74 65 20 70   doesnt update p
8750: 61 72 65 6e 74 27 2c 20 66 75 6e 63 74 69 6f 6e  arent', function
8760: 28 29 20 7b 0a 0a 20 20 20 20 69 6e 6a 65 63 74  () {..    inject
8770: 48 54 4d 4c 28 27 3c 72 69 6f 74 2d 74 6d 70 3e  HTML('<riot-tmp>
8780: 3c 2f 72 69 6f 74 2d 74 6d 70 3e 27 29 0a 0a 20  </riot-tmp>').. 
8790: 20 20 20 72 69 6f 74 2e 74 61 67 28 27 69 6e 6e     riot.tag('inn
87a0: 65 72 27 2c 20 27 3c 62 75 74 74 6f 6e 20 72 65  er', '<button re
87b0: 66 3d 22 62 74 6e 22 20 6f 6e 63 6c 69 63 6b 3d  f="btn" onclick=
87c0: 22 7b 66 6f 6f 7d 22 20 2f 3e 27 2c 20 66 75 6e  "{foo}" />', fun
87d0: 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20 20 20  ction() {.      
87e0: 74 68 69 73 2e 66 6f 6f 20 3d 20 66 75 6e 63 74  this.foo = funct
87f0: 69 6f 6e 28 29 20 7b 7d 2e 62 69 6e 64 28 29 0a  ion() {}.bind().
8800: 20 20 20 20 7d 29 0a 0a 20 20 20 20 72 69 6f 74      })..    riot
8810: 2e 74 61 67 28 27 72 69 6f 74 2d 74 6d 70 27 2c  .tag('riot-tmp',
8820: 20 27 3c 69 6e 6e 65 72 20 65 61 63 68 3d 22 7b   '<inner each="{
8830: 69 74 65 6d 20 69 6e 20 69 74 65 6d 73 7d 22 20  item in items}" 
8840: 2f 3e 27 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20  />', function() 
8850: 7b 0a 20 20 20 20 20 20 74 68 69 73 2e 69 74 65  {.      this.ite
8860: 6d 73 20 3d 20 5b 31 5d 0a 20 20 20 20 20 20 74  ms = [1].      t
8870: 68 69 73 2e 75 70 64 61 74 65 43 6f 75 6e 74 20  his.updateCount 
8880: 3d 20 30 0a 20 20 20 20 20 20 74 68 69 73 2e 6f  = 0.      this.o
8890: 6e 28 27 75 70 64 61 74 65 27 2c 20 66 75 6e 63  n('update', func
88a0: 74 69 6f 6e 28 29 20 7b 20 74 68 69 73 2e 75 70  tion() { this.up
88b0: 64 61 74 65 43 6f 75 6e 74 2b 2b 20 7d 29 0a 20  dateCount++ }). 
88c0: 20 20 20 7d 29 0a 0a 20 20 20 20 76 61 72 20 74     })..    var t
88d0: 61 67 20 3d 20 72 69 6f 74 2e 6d 6f 75 6e 74 28  ag = riot.mount(
88e0: 27 72 69 6f 74 2d 74 6d 70 27 29 5b 30 5d 0a 0a  'riot-tmp')[0]..
88f0: 20 20 20 20 65 78 70 65 63 74 28 74 61 67 2e 75      expect(tag.u
8900: 70 64 61 74 65 43 6f 75 6e 74 29 2e 74 6f 2e 62  pdateCount).to.b
8910: 65 2e 65 71 75 61 6c 28 30 29 0a 20 20 20 20 66  e.equal(0).    f
8920: 69 72 65 45 76 65 6e 74 28 74 61 67 2e 74 61 67  ireEvent(tag.tag
8930: 73 2e 69 6e 6e 65 72 5b 30 5d 2e 72 65 66 73 2e  s.inner[0].refs.
8940: 62 74 6e 2c 20 27 63 6c 69 63 6b 27 29 0a 20 20  btn, 'click').  
8950: 20 20 65 78 70 65 63 74 28 74 61 67 2e 75 70 64    expect(tag.upd
8960: 61 74 65 43 6f 75 6e 74 29 2e 74 6f 2e 62 65 2e  ateCount).to.be.
8970: 65 71 75 61 6c 28 30 29 0a 0a 0a 20 20 20 20 74  equal(0)...    t
8980: 61 67 2e 75 6e 6d 6f 75 6e 74 28 29 0a 0a 20 20  ag.unmount()..  
8990: 7d 29 0a 0a 20 20 69 74 28 27 74 68 65 20 63 6c  })..  it('the cl
89a0: 61 73 73 20 61 74 74 72 69 62 75 74 65 73 20 67  ass attributes g
89b0: 65 74 20 70 72 6f 70 65 72 6c 79 20 72 65 6d 6f  et properly remo
89c0: 76 65 64 20 69 6e 20 63 61 73 65 20 6f 66 20 66  ved in case of f
89d0: 61 6c 73 79 20 76 61 6c 75 65 73 27 2c 20 66 75  alsy values', fu
89e0: 6e 63 74 69 6f 6e 28 64 6f 6e 65 29 20 7b 0a 0a  nction(done) {..
89f0: 20 20 20 20 69 6e 6a 65 63 74 48 54 4d 4c 28 27      injectHTML('
8a00: 3c 72 69 6f 74 2d 74 6d 70 3e 3c 2f 72 69 6f 74  <riot-tmp></riot
8a10: 2d 74 6d 70 3e 27 29 0a 0a 20 20 20 20 72 69 6f  -tmp>')..    rio
8a20: 74 2e 74 61 67 28 27 72 69 6f 74 2d 74 6d 70 27  t.tag('riot-tmp'
8a30: 2c 20 27 3c 70 20 63 6c 61 73 73 3d 22 7b 20 66  , '<p class="{ f
8a40: 6f 6f 3a 20 69 73 46 6f 6f 20 7d 22 3e 66 6f 6f  oo: isFoo }">foo
8a50: 3c 2f 70 3e 27 2c 20 66 75 6e 63 74 69 6f 6e 28  </p>', function(
8a60: 29 20 7b 0a 20 20 20 20 20 20 74 68 69 73 2e 69  ) {.      this.i
8a70: 73 46 6f 6f 20 3d 20 74 72 75 65 0a 20 20 20 20  sFoo = true.    
8a80: 7d 29 0a 0a 20 20 20 20 76 61 72 20 74 61 67 20  })..    var tag 
8a90: 3d 20 72 69 6f 74 2e 6d 6f 75 6e 74 28 27 72 69  = riot.mount('ri
8aa0: 6f 74 2d 74 6d 70 27 29 5b 30 5d 2c 0a 20 20 20  ot-tmp')[0],.   
8ab0: 20 20 20 70 20 3d 20 24 28 27 70 27 2c 20 74 61     p = $('p', ta
8ac0: 67 2e 72 6f 6f 74 29 0a 0a 20 20 20 20 65 78 70  g.root)..    exp
8ad0: 65 63 74 28 70 2e 68 61 73 41 74 74 72 69 62 75  ect(p.hasAttribu
8ae0: 74 65 28 27 63 6c 61 73 73 27 29 29 2e 74 6f 2e  te('class')).to.
8af0: 62 65 2e 65 71 75 61 6c 28 74 72 75 65 29 0a 0a  be.equal(true)..
8b00: 20 20 20 20 2f 2f 20 45 64 67 65 20 31 36 20 68      // Edge 16 h
8b10: 61 73 20 73 6f 6d 65 20 72 61 63 65 20 63 6f 6e  as some race con
8b20: 64 69 74 69 6f 6e 20 69 73 73 75 65 73 20 73 6f  dition issues so
8b30: 20 77 65 20 6e 65 65 64 20 74 6f 20 64 65 66 65   we need to defe
8b40: 72 20 74 68 69 73 20 63 68 65 63 6b 0a 20 20 20  r this check.   
8b50: 20 73 65 74 54 69 6d 65 6f 75 74 28 28 29 20 3d   setTimeout(() =
8b60: 3e 20 7b 0a 20 20 20 20 20 20 74 61 67 2e 69 73  > {.      tag.is
8b70: 46 6f 6f 20 3d 20 66 61 6c 73 65 0a 20 20 20 20  Foo = false.    
8b80: 20 20 74 61 67 2e 75 70 64 61 74 65 28 29 0a 20    tag.update(). 
8b90: 20 20 20 20 20 65 78 70 65 63 74 28 70 2e 68 61       expect(p.ha
8ba0: 73 41 74 74 72 69 62 75 74 65 28 27 63 6c 61 73  sAttribute('clas
8bb0: 73 27 29 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c  s')).to.be.equal
8bc0: 28 66 61 6c 73 65 29 0a 20 20 20 20 20 20 74 61  (false).      ta
8bd0: 67 2e 75 6e 6d 6f 75 6e 74 28 29 0a 20 20 20 20  g.unmount().    
8be0: 20 20 64 6f 6e 65 28 29 0a 20 20 20 20 7d 2c 20    done().    }, 
8bf0: 31 30 30 29 0a 20 20 7d 29 0a 0a 20 20 69 74 28  100).  })..  it(
8c00: 27 63 75 73 74 6f 6d 20 61 74 74 72 69 62 75 74  'custom attribut
8c10: 65 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  es should not be
8c20: 20 72 65 6d 6f 76 65 64 20 69 66 20 6e 6f 74 20   removed if not 
8c30: 66 61 6c 73 79 27 2c 20 66 75 6e 63 74 69 6f 6e  falsy', function
8c40: 28 29 20 7b 0a 20 20 20 20 69 6e 6a 65 63 74 48  () {.    injectH
8c50: 54 4d 4c 28 27 3c 72 69 6f 74 2d 74 6d 70 20 64  TML('<riot-tmp d
8c60: 61 74 61 2d 69 6e 64 65 78 3d 22 7b 20 69 6e 64  ata-index="{ ind
8c70: 65 78 20 7d 22 3e 3c 2f 72 69 6f 74 2d 74 6d 70  ex }"></riot-tmp
8c80: 3e 27 29 0a 0a 20 20 20 20 72 69 6f 74 2e 74 61  >')..    riot.ta
8c90: 67 28 27 72 69 6f 74 2d 74 6d 70 27 2c 20 27 3c  g('riot-tmp', '<
8ca0: 70 3e 3c 2f 70 3e 27 2c 20 66 75 6e 63 74 69 6f  p></p>', functio
8cb0: 6e 28 29 20 7b 0a 20 20 20 20 20 20 74 68 69 73  n() {.      this
8cc0: 2e 69 6e 64 65 78 20 3d 20 30 0a 20 20 20 20 7d  .index = 0.    }
8cd0: 29 0a 0a 20 20 20 20 76 61 72 20 74 61 67 20 3d  )..    var tag =
8ce0: 20 72 69 6f 74 2e 6d 6f 75 6e 74 28 27 72 69 6f   riot.mount('rio
8cf0: 74 2d 74 6d 70 27 29 5b 30 5d 0a 0a 20 20 20 20  t-tmp')[0]..    
8d00: 65 78 70 65 63 74 28 74 61 67 2e 6f 70 74 73 2e  expect(tag.opts.
8d10: 64 61 74 61 49 6e 64 65 78 29 2e 74 6f 2e 62 65  dataIndex).to.be
8d20: 2e 65 71 75 61 6c 28 30 29 0a 20 20 20 20 65 78  .equal(0).    ex
8d30: 70 65 63 74 28 74 61 67 2e 72 6f 6f 74 2e 67 65  pect(tag.root.ge
8d40: 74 41 74 74 72 69 62 75 74 65 28 27 64 61 74 61  tAttribute('data
8d50: 2d 69 6e 64 65 78 27 29 29 2e 74 6f 2e 62 65 2e  -index')).to.be.
8d60: 6f 6b 0a 20 20 20 20 74 61 67 2e 69 6e 64 65 78  ok.    tag.index
8d70: 20 3d 20 66 61 6c 73 65 0a 20 20 20 20 74 61 67   = false.    tag
8d80: 2e 75 70 64 61 74 65 28 29 0a 20 20 20 20 65 78  .update().    ex
8d90: 70 65 63 74 28 74 61 67 2e 72 6f 6f 74 2e 67 65  pect(tag.root.ge
8da0: 74 41 74 74 72 69 62 75 74 65 28 27 64 61 74 61  tAttribute('data
8db0: 2d 69 6e 64 65 78 27 29 29 2e 74 6f 2e 62 65 2e  -index')).to.be.
8dc0: 6e 6f 74 2e 6f 6b 0a 0a 20 20 20 20 74 61 67 2e  not.ok..    tag.
8dd0: 75 6e 6d 6f 75 6e 74 28 29 0a 20 20 7d 29 0a 0a  unmount().  })..
8de0: 20 20 69 74 28 27 6d 61 6b 65 20 73 75 72 65 20    it('make sure 
8df0: 74 68 65 20 74 61 67 20 63 6f 6e 74 65 78 74 20  the tag context 
8e00: 69 73 20 70 72 65 73 65 72 76 65 64 20 64 75 72  is preserved dur
8e10: 69 6e 67 20 75 70 64 61 74 65 73 27 2c 20 66 75  ing updates', fu
8e20: 6e 63 74 69 6f 6e 28 64 6f 6e 65 29 20 7b 0a 20  nction(done) {. 
8e30: 20 20 20 69 6e 6a 65 63 74 48 54 4d 4c 28 27 3c     injectHTML('<
8e40: 75 70 64 61 74 65 2d 63 6f 6e 74 65 78 74 3e 3c  update-context><
8e50: 2f 75 70 64 61 74 65 2d 63 6f 6e 74 65 78 74 3e  /update-context>
8e60: 27 29 0a 0a 20 20 20 20 76 61 72 20 74 61 67 20  ')..    var tag 
8e70: 3d 20 72 69 6f 74 2e 6d 6f 75 6e 74 28 27 75 70  = riot.mount('up
8e80: 64 61 74 65 2d 63 6f 6e 74 65 78 74 27 29 5b 30  date-context')[0
8e90: 5d 0a 0a 20 20 20 20 65 78 70 65 63 74 28 74 61  ]..    expect(ta
8ea0: 67 2e 6d 65 73 73 61 67 65 29 2e 74 6f 2e 62 65  g.message).to.be
8eb0: 2e 65 71 75 61 6c 28 27 68 69 27 29 0a 0a 20 20  .equal('hi')..  
8ec0: 20 20 74 61 67 2e 6f 6e 28 27 75 70 64 61 74 65    tag.on('update
8ed0: 64 27 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b  d', function() {
8ee0: 0a 20 20 20 20 20 20 65 78 70 65 63 74 28 24 28  .      expect($(
8ef0: 27 70 27 2c 20 74 68 69 73 2e 72 6f 6f 74 29 2e  'p', this.root).
8f00: 74 65 78 74 43 6f 6e 74 65 6e 74 29 2e 74 6f 2e  textContent).to.
8f10: 62 65 2e 65 71 75 61 6c 28 27 67 6f 6f 64 62 79  be.equal('goodby
8f20: 65 27 29 0a 20 20 20 20 20 20 65 78 70 65 63 74  e').      expect
8f30: 28 74 61 67 2e 75 6e 6d 6f 75 6e 74 28 29 29 2e  (tag.unmount()).
8f40: 74 6f 2e 62 65 2e 61 6e 28 27 6f 62 6a 65 63 74  to.be.an('object
8f50: 27 29 0a 20 20 20 20 20 20 64 6f 6e 65 28 29 0a  ').      done().
8f60: 20 20 20 20 20 20 74 61 67 2e 75 6e 6d 6f 75 6e        tag.unmoun
8f70: 74 28 29 0a 20 20 20 20 7d 29 0a 20 20 7d 29 0a  t().    }).  }).
8f80: 0a 20 20 69 74 28 27 63 72 65 61 74 65 20 74 61  .  it('create ta
8f90: 67 73 20 65 78 74 65 6e 64 69 6e 67 20 74 68 65  gs extending the
8fa0: 20 72 69 6f 74 2e 54 61 67 20 63 6f 6e 73 74 72   riot.Tag constr
8fb0: 75 63 74 6f 72 27 2c 20 66 75 6e 63 74 69 6f 6e  uctor', function
8fc0: 28 29 20 7b 0a 20 20 20 20 63 6c 61 73 73 20 43  () {.    class C
8fd0: 6f 6d 70 6f 6e 65 6e 74 20 65 78 74 65 6e 64 73  omponent extends
8fe0: 20 72 69 6f 74 2e 54 61 67 20 7b 0a 20 20 20 20   riot.Tag {.    
8ff0: 20 20 67 65 74 20 6e 61 6d 65 28 29 20 7b 20 72    get name() { r
9000: 65 74 75 72 6e 20 27 63 6f 6d 70 6f 6e 65 6e 74  eturn 'component
9010: 27 20 7d 0a 20 20 20 20 20 20 67 65 74 20 74 6d  ' }.      get tm
9020: 70 6c 28 29 20 7b 20 72 65 74 75 72 6e 20 27 3c  pl() { return '<
9030: 68 31 20 6f 6e 63 6c 69 63 6b 3d 22 7b 20 6f 6e  h1 onclick="{ on
9040: 43 6c 69 63 6b 20 7d 22 3e 7b 20 6f 70 74 73 2e  Click }">{ opts.
9050: 6d 65 73 73 61 67 65 20 7d 20 7b 20 75 73 65 72  message } { user
9060: 20 7d 3c 2f 68 31 3e 27 20 7d 0a 20 20 20 20 20   }</h1>' }.     
9070: 20 6f 6e 43 72 65 61 74 65 28 29 20 7b 0a 20 20   onCreate() {.  
9080: 20 20 20 20 20 20 74 68 69 73 2e 75 73 65 72 20        this.user 
9090: 3d 20 27 64 65 61 72 20 55 73 65 72 27 0a 20 20  = 'dear User'.  
90a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 6f 6e 43 6c      }.      onCl
90b0: 69 63 6b 28 29 20 7b 0a 20 20 20 20 20 20 20 20  ick() {.        
90c0: 74 68 69 73 2e 75 73 65 72 20 3d 20 27 74 68 65  this.user = 'the
90d0: 20 75 73 65 72 20 69 73 20 67 6f 6e 65 27 0a 20   user is gone'. 
90e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
90f0: 20 20 76 61 72 20 63 6f 6d 70 6f 6e 65 6e 74 20    var component 
9100: 3d 20 6e 65 77 20 43 6f 6d 70 6f 6e 65 6e 74 28  = new Component(
9110: 64 6f 63 75 6d 65 6e 74 2e 63 72 65 61 74 65 45  document.createE
9120: 6c 65 6d 65 6e 74 28 27 64 69 76 27 29 2c 20 7b  lement('div'), {
9130: 0a 20 20 20 20 20 20 6d 65 73 73 61 67 65 3a 20  .      message: 
9140: 27 68 65 6c 6c 6f 27 0a 20 20 20 20 7d 29 0a 20  'hello'.    }). 
9150: 20 20 20 76 61 72 20 68 31 20 3d 20 24 28 27 68     var h1 = $('h
9160: 31 27 2c 20 63 6f 6d 70 6f 6e 65 6e 74 2e 72 6f  1', component.ro
9170: 6f 74 29 0a 0a 20 20 20 20 65 78 70 65 63 74 28  ot)..    expect(
9180: 63 6f 6d 70 6f 6e 65 6e 74 2e 6f 70 74 73 2e 6d  component.opts.m
9190: 65 73 73 61 67 65 29 2e 74 6f 2e 62 65 2e 65 71  essage).to.be.eq
91a0: 75 61 6c 28 27 68 65 6c 6c 6f 27 29 0a 20 20 20  ual('hello').   
91b0: 20 65 78 70 65 63 74 28 63 6f 6d 70 6f 6e 65 6e   expect(componen
91c0: 74 2e 75 73 65 72 29 2e 74 6f 2e 62 65 2e 65 71  t.user).to.be.eq
91d0: 75 61 6c 28 27 64 65 61 72 20 55 73 65 72 27 29  ual('dear User')
91e0: 0a 20 20 20 20 65 78 70 65 63 74 28 68 31 2e 74  .    expect(h1.t
91f0: 65 78 74 43 6f 6e 74 65 6e 74 29 2e 74 6f 2e 62  extContent).to.b
9200: 65 2e 65 71 75 61 6c 28 27 68 65 6c 6c 6f 20 64  e.equal('hello d
9210: 65 61 72 20 55 73 65 72 27 29 0a 0a 20 20 20 20  ear User')..    
9220: 66 69 72 65 45 76 65 6e 74 28 68 31 2c 20 27 63  fireEvent(h1, 'c
9230: 6c 69 63 6b 27 29 0a 0a 20 20 20 20 65 78 70 65  lick')..    expe
9240: 63 74 28 68 31 2e 74 65 78 74 43 6f 6e 74 65 6e  ct(h1.textConten
9250: 74 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27  t).to.be.equal('
9260: 68 65 6c 6c 6f 20 74 68 65 20 75 73 65 72 20 69  hello the user i
9270: 73 20 67 6f 6e 65 27 29 0a 0a 20 20 20 20 2f 2f  s gone')..    //
9280: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   make sure the c
9290: 6f 6d 70 6f 6e 65 6e 74 20 69 73 20 70 72 6f 70  omponent is prop
92a0: 65 72 6c 79 20 72 65 67 69 73 74 65 72 65 64 0a  erly registered.
92b0: 20 20 20 20 69 6e 6a 65 63 74 48 54 4d 4c 28 27      injectHTML('
92c0: 3c 63 6f 6d 70 6f 6e 65 6e 74 3e 3c 2f 63 6f 6d  <component></com
92d0: 70 6f 6e 65 6e 74 3e 27 29 0a 0a 20 20 20 20 76  ponent>')..    v
92e0: 61 72 20 74 61 67 20 3d 20 72 69 6f 74 2e 6d 6f  ar tag = riot.mo
92f0: 75 6e 74 28 27 63 6f 6d 70 6f 6e 65 6e 74 27 2c  unt('component',
9300: 20 7b 6d 65 73 73 61 67 65 3a 20 27 68 69 27 7d   {message: 'hi'}
9310: 29 5b 30 5d 0a 20 20 20 20 65 78 70 65 63 74 28  )[0].    expect(
9320: 74 61 67 2e 6f 70 74 73 2e 6d 65 73 73 61 67 65  tag.opts.message
9330: 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27 68  ).to.be.equal('h
9340: 69 27 29 0a 0a 20 20 20 20 74 61 67 2e 75 6e 6d  i')..    tag.unm
9350: 6f 75 6e 74 28 29 0a 20 20 20 20 63 6f 6d 70 6f  ount().    compo
9360: 6e 65 6e 74 2e 75 6e 6d 6f 75 6e 74 28 29 0a 20  nent.unmount(). 
9370: 20 7d 29 0a 0a 20 20 69 74 28 27 65 78 74 65 6e   })..  it('exten
9380: 64 20 65 78 69 73 74 69 6e 67 20 74 61 67 73 20  d existing tags 
9390: 63 72 65 61 74 65 64 20 76 69 61 20 72 69 6f 74  created via riot
93a0: 2e 54 61 67 20 63 6f 6e 73 74 72 75 63 74 6f 72  .Tag constructor
93b0: 27 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a  ', function() {.
93c0: 20 20 20 20 63 6c 61 73 73 20 43 6f 6d 70 6f 6e      class Compon
93d0: 65 6e 74 20 65 78 74 65 6e 64 73 20 72 69 6f 74  ent extends riot
93e0: 2e 54 61 67 20 7b 0a 20 20 20 20 20 20 67 65 74  .Tag {.      get
93f0: 20 6e 61 6d 65 28 29 20 7b 20 72 65 74 75 72 6e   name() { return
9400: 20 27 63 6f 6d 70 6f 6e 65 6e 74 27 20 7d 0a 20   'component' }. 
9410: 20 20 20 20 20 67 65 74 20 74 6d 70 6c 28 29 20       get tmpl() 
9420: 7b 20 72 65 74 75 72 6e 20 27 3c 68 31 20 6f 6e  { return '<h1 on
9430: 63 6c 69 63 6b 3d 22 7b 20 6f 6e 43 6c 69 63 6b  click="{ onClick
9440: 20 7d 22 3e 7b 20 6f 70 74 73 2e 6d 65 73 73 61   }">{ opts.messa
9450: 67 65 20 7d 20 7b 20 75 73 65 72 20 7d 3c 2f 68  ge } { user }</h
9460: 31 3e 27 20 7d 0a 20 20 20 20 20 20 6f 6e 43 72  1>' }.      onCr
9470: 65 61 74 65 28 29 20 7b 0a 20 20 20 20 20 20 20  eate() {.       
9480: 20 74 68 69 73 2e 75 73 65 72 20 3d 20 27 64 65   this.user = 'de
9490: 61 72 20 55 73 65 72 27 0a 20 20 20 20 20 20 7d  ar User'.      }
94a0: 0a 20 20 20 20 20 20 6f 6e 43 6c 69 63 6b 28 29  .      onClick()
94b0: 20 7b 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e   {.        this.
94c0: 75 73 65 72 20 3d 20 27 74 68 65 20 75 73 65 72  user = 'the user
94d0: 20 69 73 20 67 6f 6e 65 27 0a 20 20 20 20 20 20   is gone'.      
94e0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 6c 61  }.    }..    cla
94f0: 73 73 20 53 75 62 43 6f 6d 70 6f 6e 65 6e 74 20  ss SubComponent 
9500: 65 78 74 65 6e 64 73 20 43 6f 6d 70 6f 6e 65 6e  extends Componen
9510: 74 20 7b 0a 20 20 20 20 20 20 67 65 74 20 6e 61  t {.      get na
9520: 6d 65 28 29 20 7b 20 72 65 74 75 72 6e 20 27 73  me() { return 's
9530: 75 62 2d 63 6f 6d 70 6f 6e 65 6e 74 27 20 7d 0a  ub-component' }.
9540: 20 20 20 20 20 20 67 65 74 20 74 6d 70 6c 28 29        get tmpl()
9550: 20 7b 20 72 65 74 75 72 6e 20 27 3c 68 32 20 6f   { return '<h2 o
9560: 6e 63 6c 69 63 6b 3d 22 7b 20 6f 6e 43 6c 69 63  nclick="{ onClic
9570: 6b 20 7d 22 3e 7b 20 6f 70 74 73 2e 6d 65 73 73  k }">{ opts.mess
9580: 61 67 65 20 7d 20 7b 20 75 73 65 72 20 7d 3c 2f  age } { user }</
9590: 68 32 3e 27 20 7d 0a 20 20 20 20 7d 0a 0a 20 20  h2>' }.    }..  
95a0: 20 20 76 61 72 20 73 75 62 43 6f 6d 70 6f 6e 65    var subCompone
95b0: 6e 74 20 3d 20 6e 65 77 20 53 75 62 43 6f 6d 70  nt = new SubComp
95c0: 6f 6e 65 6e 74 28 64 6f 63 75 6d 65 6e 74 2e 63  onent(document.c
95d0: 72 65 61 74 65 45 6c 65 6d 65 6e 74 28 27 64 69  reateElement('di
95e0: 76 27 29 2c 20 7b 0a 20 20 20 20 20 20 6d 65 73  v'), {.      mes
95f0: 73 61 67 65 3a 20 27 68 65 6c 6c 6f 27 0a 20 20  sage: 'hello'.  
9600: 20 20 7d 29 0a 0a 20 20 20 20 76 61 72 20 68 32    })..    var h2
9610: 20 3d 20 24 28 27 68 32 27 2c 20 73 75 62 43 6f   = $('h2', subCo
9620: 6d 70 6f 6e 65 6e 74 2e 72 6f 6f 74 29 0a 0a 20  mponent.root).. 
9630: 20 20 20 65 78 70 65 63 74 28 73 75 62 43 6f 6d     expect(subCom
9640: 70 6f 6e 65 6e 74 2e 6f 70 74 73 2e 6d 65 73 73  ponent.opts.mess
9650: 61 67 65 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c  age).to.be.equal
9660: 28 27 68 65 6c 6c 6f 27 29 0a 20 20 20 20 65 78  ('hello').    ex
9670: 70 65 63 74 28 73 75 62 43 6f 6d 70 6f 6e 65 6e  pect(subComponen
9680: 74 2e 75 73 65 72 29 2e 74 6f 2e 62 65 2e 65 71  t.user).to.be.eq
9690: 75 61 6c 28 27 64 65 61 72 20 55 73 65 72 27 29  ual('dear User')
96a0: 0a 20 20 20 20 65 78 70 65 63 74 28 68 32 2e 74  .    expect(h2.t
96b0: 65 78 74 43 6f 6e 74 65 6e 74 29 2e 74 6f 2e 62  extContent).to.b
96c0: 65 2e 65 71 75 61 6c 28 27 68 65 6c 6c 6f 20 64  e.equal('hello d
96d0: 65 61 72 20 55 73 65 72 27 29 0a 0a 20 20 20 20  ear User')..    
96e0: 2f 2f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  // make sure the
96f0: 20 73 75 62 2d 63 6f 6d 70 6f 6e 65 6e 74 20 69   sub-component i
9700: 73 20 70 72 6f 70 65 72 6c 79 20 72 65 67 69 73  s properly regis
9710: 74 65 72 65 64 0a 20 20 20 20 69 6e 6a 65 63 74  tered.    inject
9720: 48 54 4d 4c 28 27 3c 73 75 62 2d 63 6f 6d 70 6f  HTML('<sub-compo
9730: 6e 65 6e 74 3e 3c 2f 73 75 62 2d 63 6f 6d 70 6f  nent></sub-compo
9740: 6e 65 6e 74 3e 27 29 0a 0a 20 20 20 20 76 61 72  nent>')..    var
9750: 20 74 61 67 20 3d 20 72 69 6f 74 2e 6d 6f 75 6e   tag = riot.moun
9760: 74 28 27 73 75 62 2d 63 6f 6d 70 6f 6e 65 6e 74  t('sub-component
9770: 27 2c 20 7b 6d 65 73 73 61 67 65 3a 20 27 68 69  ', {message: 'hi
9780: 27 7d 29 5b 30 5d 0a 20 20 20 20 65 78 70 65 63  '})[0].    expec
9790: 74 28 74 61 67 2e 6f 70 74 73 2e 6d 65 73 73 61  t(tag.opts.messa
97a0: 67 65 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28  ge).to.be.equal(
97b0: 27 68 69 27 29 0a 0a 20 20 20 20 74 61 67 2e 75  'hi')..    tag.u
97c0: 6e 6d 6f 75 6e 74 28 29 0a 20 20 20 20 73 75 62  nmount().    sub
97d0: 43 6f 6d 70 6f 6e 65 6e 74 2e 75 6e 6d 6f 75 6e  Component.unmoun
97e0: 74 28 29 0a 20 20 7d 29 0a 0a 20 20 69 74 28 27  t().  })..  it('
97f0: 67 65 74 73 20 74 68 65 20 72 65 66 65 72 65 6e  gets the referen
9800: 63 65 20 62 79 20 64 61 74 61 2d 72 65 66 20 61  ce by data-ref a
9810: 74 74 72 69 62 75 74 65 27 2c 20 66 75 6e 63 74  ttribute', funct
9820: 69 6f 6e 28 29 20 7b 0a 20 20 20 20 69 6e 6a 65  ion() {.    inje
9830: 63 74 48 54 4d 4c 28 27 3c 6e 61 6d 65 64 2d 64  ctHTML('<named-d
9840: 61 74 61 2d 72 65 66 3e 3c 2f 6e 61 6d 65 64 2d  ata-ref></named-
9850: 64 61 74 61 2d 72 65 66 3e 27 29 0a 20 20 20 20  data-ref>').    
9860: 76 61 72 20 74 61 67 20 3d 20 72 69 6f 74 2e 6d  var tag = riot.m
9870: 6f 75 6e 74 28 27 6e 61 6d 65 64 2d 64 61 74 61  ount('named-data
9880: 2d 72 65 66 27 29 5b 30 5d 0a 20 20 20 20 65 78  -ref')[0].    ex
9890: 70 65 63 74 28 74 61 67 2e 72 65 66 73 2e 67 72  pect(tag.refs.gr
98a0: 65 65 74 69 6e 67 2e 76 61 6c 75 65 29 2e 74 6f  eeting.value).to
98b0: 2e 62 65 2e 65 71 75 61 6c 28 27 48 65 6c 6c 6f  .be.equal('Hello
98c0: 27 29 0a 0a 20 20 20 20 74 61 67 2e 75 6e 6d 6f  ')..    tag.unmo
98d0: 75 6e 74 28 29 0a 20 20 7d 29 0a 0a 20 20 69 74  unt().  })..  it
98e0: 28 27 75 6e 6d 6f 75 6e 74 69 6e 67 20 61 20 74  ('unmounting a t
98f0: 61 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 72 65  ag containing re
9900: 66 20 77 69 6c 6c 20 6e 6f 74 20 74 68 72 6f 77  f will not throw
9910: 27 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a  ', function() {.
9920: 0a 20 20 20 20 69 6e 6a 65 63 74 48 54 4d 4c 28  .    injectHTML(
9930: 27 3c 72 69 6f 74 2d 74 6d 70 3e 3c 2f 72 69 6f  '<riot-tmp></rio
9940: 74 2d 74 6d 70 3e 27 29 0a 0a 20 20 20 20 72 69  t-tmp>')..    ri
9950: 6f 74 2e 74 61 67 28 27 72 69 6f 74 2d 74 6d 70  ot.tag('riot-tmp
9960: 27 2c 20 27 3c 64 69 76 20 72 65 66 3d 22 63 68  ', '<div ref="ch
9970: 69 6c 64 22 20 6f 6e 63 6c 69 63 6b 3d 22 7b 20  ild" onclick="{ 
9980: 75 6e 6d 6f 75 6e 74 20 7d 22 3e 3c 2f 64 69 76  unmount }"></div
9990: 3e 27 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b  >', function() {
99a0: 0a 20 20 20 20 20 20 74 68 69 73 2e 69 73 46 6f  .      this.isFo
99b0: 6f 20 3d 20 74 72 75 65 0a 20 20 20 20 7d 29 0a  o = true.    }).
99c0: 0a 20 20 20 20 76 61 72 20 74 61 67 20 3d 20 72  .    var tag = r
99d0: 69 6f 74 2e 6d 6f 75 6e 74 28 27 72 69 6f 74 2d  iot.mount('riot-
99e0: 74 6d 70 27 29 5b 30 5d 0a 20 20 20 20 66 69 72  tmp')[0].    fir
99f0: 65 45 76 65 6e 74 28 74 61 67 2e 72 65 66 73 2e  eEvent(tag.refs.
9a00: 63 68 69 6c 64 2c 20 27 63 6c 69 63 6b 27 29 0a  child, 'click').
9a10: 20 20 20 20 65 78 70 65 63 74 28 74 61 67 2e 69      expect(tag.i
9a20: 73 4d 6f 75 6e 74 65 64 29 2e 74 6f 2e 62 65 2e  sMounted).to.be.
9a30: 65 71 75 61 6c 28 66 61 6c 73 65 29 0a 20 20 20  equal(false).   
9a40: 20 74 61 67 2e 75 6e 6d 6f 75 6e 74 28 29 0a 20   tag.unmount(). 
9a50: 20 7d 29 0a 0a 20 20 69 74 28 27 64 6f 6d 20 6e   })..  it('dom n
9a60: 6f 64 65 73 20 20 68 61 76 69 6e 67 20 22 72 65  odes  having "re
9a70: 66 22 20 61 74 74 72 69 62 75 74 65 73 20 61 6e  f" attributes an
9a80: 64 20 75 70 67 72 61 64 65 64 20 74 6f 20 74 61  d upgraded to ta
9a90: 67 73 20 64 6f 20 6e 6f 74 20 61 70 70 65 61 72  gs do not appear
9aa0: 74 20 74 77 69 63 65 20 69 6e 20 74 68 65 20 70  t twice in the p
9ab0: 61 72 65 6e 74 27 2c 20 66 75 6e 63 74 69 6f 6e  arent', function
9ac0: 28 29 20 7b 0a 20 20 20 20 69 6e 6a 65 63 74 48  () {.    injectH
9ad0: 54 4d 4c 28 27 3c 72 69 6f 74 2d 74 6d 70 3e 3c  TML('<riot-tmp><
9ae0: 2f 72 69 6f 74 2d 74 6d 70 3e 27 29 0a 20 20 20  /riot-tmp>').   
9af0: 20 72 69 6f 74 2e 74 61 67 28 27 72 69 6f 74 2d   riot.tag('riot-
9b00: 74 6d 70 2d 73 75 62 27 2c 20 27 3c 70 3e 68 69  tmp-sub', '<p>hi
9b10: 3c 2f 70 3e 27 29 0a 0a 20 20 20 20 72 69 6f 74  </p>')..    riot
9b20: 2e 74 61 67 28 27 72 69 6f 74 2d 74 6d 70 27 2c  .tag('riot-tmp',
9b30: 20 27 3c 64 69 76 20 72 65 66 3d 22 63 68 69 6c   '<div ref="chil
9b40: 64 22 3e 3c 2f 64 69 76 3e 27 2c 20 66 75 6e 63  d"></div>', func
9b50: 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20 20 20 74  tion() {.      t
9b60: 68 69 73 2e 6f 6e 28 27 6d 6f 75 6e 74 27 2c 20  his.on('mount', 
9b70: 28 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20  () => {.        
9b80: 72 69 6f 74 2e 6d 6f 75 6e 74 28 74 68 69 73 2e  riot.mount(this.
9b90: 72 65 66 73 2e 63 68 69 6c 64 2c 20 27 72 69 6f  refs.child, 'rio
9ba0: 74 2d 74 6d 70 2d 73 75 62 27 2c 20 7b 20 70 61  t-tmp-sub', { pa
9bb0: 72 65 6e 74 3a 20 74 68 69 73 20 7d 29 0a 20 20  rent: this }).  
9bc0: 20 20 20 20 7d 29 0a 20 20 20 20 7d 29 0a 0a 20      }).    }).. 
9bd0: 20 20 20 76 61 72 20 74 61 67 20 3d 20 72 69 6f     var tag = rio
9be0: 74 2e 6d 6f 75 6e 74 28 27 72 69 6f 74 2d 74 6d  t.mount('riot-tm
9bf0: 70 27 29 5b 30 5d 0a 0a 20 20 20 20 65 78 70 65  p')[0]..    expe
9c00: 63 74 28 74 61 67 2e 72 65 66 73 2e 63 68 69 6c  ct(tag.refs.chil
9c10: 64 29 2e 74 6f 2e 62 65 2e 6e 6f 74 2e 61 6e 28  d).to.be.not.an(
9c20: 27 61 72 72 61 79 27 29 0a 20 20 20 20 65 78 70  'array').    exp
9c30: 65 63 74 28 74 61 67 2e 72 65 66 73 2e 63 68 69  ect(tag.refs.chi
9c40: 6c 64 2e 68 61 73 41 74 74 72 69 62 75 74 65 28  ld.hasAttribute(
9c50: 27 72 65 66 27 29 29 2e 74 6f 2e 62 65 2e 6f 6b  'ref')).to.be.ok
9c60: 0a 0a 20 20 20 20 74 61 67 2e 75 6e 6d 6f 75 6e  ..    tag.unmoun
9c70: 74 28 29 0a 20 20 7d 29 0a 0a 20 20 69 74 28 27  t().  })..  it('
9c80: 72 65 66 20 61 74 74 72 69 62 75 74 65 73 20 77  ref attributes w
9c90: 69 6c 6c 20 62 65 20 72 65 6d 6f 76 65 64 20 6f  ill be removed o
9ca0: 6e 6c 79 20 69 66 20 66 61 6c 73 79 20 6f 72 20  nly if falsy or 
9cb0: 6e 6f 74 20 73 74 72 69 6e 67 73 27 2c 20 66 75  not strings', fu
9cc0: 6e 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20 69  nction() {.    i
9cd0: 6e 6a 65 63 74 48 54 4d 4c 28 27 3c 72 69 6f 74  njectHTML('<riot
9ce0: 2d 74 6d 70 3e 3c 2f 72 69 6f 74 2d 74 6d 70 3e  -tmp></riot-tmp>
9cf0: 27 29 0a 0a 20 20 20 20 72 69 6f 74 2e 74 61 67  ')..    riot.tag
9d00: 28 27 72 69 6f 74 2d 74 6d 70 27 2c 20 60 0a 20  ('riot-tmp', `. 
9d10: 20 20 20 20 20 3c 64 69 76 20 72 65 66 3d 27 63       <div ref='c
9d20: 68 69 6c 64 27 3e 3c 2f 64 69 76 3e 0a 20 20 20  hild'></div>.   
9d30: 20 20 20 3c 64 69 76 20 72 65 66 3d 22 7b 20 65     <div ref="{ e
9d40: 78 70 72 20 7d 22 3e 3c 2f 64 69 76 3e 0a 20 20  xpr }"></div>.  
9d50: 20 20 20 20 3c 64 69 76 20 72 65 66 3d 22 7b 20      <div ref="{ 
9d60: 6e 75 6c 6c 20 7d 22 3e 3c 2f 64 69 76 3e 0a 20  null }"></div>. 
9d70: 20 20 20 20 20 3c 64 69 76 20 72 65 66 3d 22 7b       <div ref="{
9d80: 20 66 61 6c 73 65 20 7d 22 3e 3c 2f 64 69 76 3e   false }"></div>
9d90: 0a 20 20 20 20 20 20 3c 64 69 76 20 72 65 66 3d  .      <div ref=
9da0: 22 7b 20 27 27 20 7d 22 3e 3c 2f 64 69 76 3e 0a  "{ '' }"></div>.
9db0: 20 20 20 20 60 2c 20 66 75 6e 63 74 69 6f 6e 28      `, function(
9dc0: 29 20 7b 0a 20 20 20 20 20 20 74 68 69 73 2e 65  ) {.      this.e
9dd0: 78 70 72 20 3d 20 27 65 78 70 72 27 0a 20 20 20  xpr = 'expr'.   
9de0: 20 7d 29 0a 0a 20 20 20 20 76 61 72 20 74 61 67   })..    var tag
9df0: 20 3d 20 72 69 6f 74 2e 6d 6f 75 6e 74 28 27 72   = riot.mount('r
9e00: 69 6f 74 2d 74 6d 70 27 29 5b 30 5d 2c 0a 20 20  iot-tmp')[0],.  
9e10: 20 20 20 20 64 69 76 73 20 3d 20 24 24 28 27 64      divs = $$('d
9e20: 69 76 27 2c 20 74 61 67 2e 72 6f 6f 74 29 0a 0a  iv', tag.root)..
9e30: 20 20 20 20 65 78 70 65 63 74 28 74 61 67 2e 72      expect(tag.r
9e40: 65 66 73 2e 63 68 69 6c 64 29 2e 74 6f 2e 62 65  efs.child).to.be
9e50: 2e 6f 6b 0a 20 20 20 20 65 78 70 65 63 74 28 74  .ok.    expect(t
9e60: 61 67 2e 72 65 66 73 2e 65 78 70 72 29 2e 74 6f  ag.refs.expr).to
9e70: 2e 62 65 2e 6f 6b 0a 0a 20 20 20 20 65 78 70 65  .be.ok..    expe
9e80: 63 74 28 64 69 76 73 5b 30 5d 2e 68 61 73 41 74  ct(divs[0].hasAt
9e90: 74 72 69 62 75 74 65 28 27 72 65 66 27 29 29 2e  tribute('ref')).
9ea0: 74 6f 2e 62 65 2e 6f 6b 0a 20 20 20 20 65 78 70  to.be.ok.    exp
9eb0: 65 63 74 28 64 69 76 73 5b 31 5d 2e 68 61 73 41  ect(divs[1].hasA
9ec0: 74 74 72 69 62 75 74 65 28 27 72 65 66 27 29 29  ttribute('ref'))
9ed0: 2e 74 6f 2e 62 65 2e 6f 6b 0a 20 20 20 20 65 78  .to.be.ok.    ex
9ee0: 70 65 63 74 28 64 69 76 73 5b 32 5d 2e 68 61 73  pect(divs[2].has
9ef0: 41 74 74 72 69 62 75 74 65 28 27 72 65 66 27 29  Attribute('ref')
9f00: 29 2e 74 6f 2e 62 65 2e 6e 6f 74 2e 6f 6b 0a 20  ).to.be.not.ok. 
9f10: 20 20 20 65 78 70 65 63 74 28 64 69 76 73 5b 33     expect(divs[3
9f20: 5d 2e 68 61 73 41 74 74 72 69 62 75 74 65 28 27  ].hasAttribute('
9f30: 72 65 66 27 29 29 2e 74 6f 2e 62 65 2e 6e 6f 74  ref')).to.be.not
9f40: 2e 6f 6b 0a 20 20 20 20 65 78 70 65 63 74 28 64  .ok.    expect(d
9f50: 69 76 73 5b 34 5d 2e 68 61 73 41 74 74 72 69 62  ivs[4].hasAttrib
9f60: 75 74 65 28 27 72 65 66 27 29 29 2e 74 6f 2e 62  ute('ref')).to.b
9f70: 65 2e 6e 6f 74 2e 6f 6b 0a 0a 20 20 20 20 74 61  e.not.ok..    ta
9f80: 67 2e 75 6e 6d 6f 75 6e 74 28 29 0a 20 20 7d 29  g.unmount().  })
9f90: 0a 0a 0a 20 20 69 74 28 27 76 69 72 74 75 61 6c  ...  it('virtual
9fa0: 20 74 61 67 73 20 63 61 6e 20 62 65 20 75 73 65   tags can be use
9fb0: 64 20 77 69 74 68 20 64 79 6e 61 6d 69 63 20 64  d with dynamic d
9fc0: 61 74 61 2d 69 73 27 2c 20 66 75 6e 63 74 69 6f  ata-is', functio
9fd0: 6e 28 29 20 7b 0a 20 20 20 20 69 6e 6a 65 63 74  n() {.    inject
9fe0: 48 54 4d 4c 28 27 3c 64 79 6e 61 6d 69 63 2d 76  HTML('<dynamic-v
9ff0: 69 72 74 75 61 6c 3e 3c 2f 64 79 6e 61 6d 69 63  irtual></dynamic
a000: 2d 76 69 72 74 75 61 6c 3e 27 29 0a 0a 20 20 20  -virtual>')..   
a010: 20 76 61 72 20 74 61 67 20 3d 20 72 69 6f 74 2e   var tag = riot.
a020: 6d 6f 75 6e 74 28 27 64 79 6e 61 6d 69 63 2d 76  mount('dynamic-v
a030: 69 72 74 75 61 6c 27 29 5b 30 5d 0a 20 20 20 20  irtual')[0].    
a040: 76 61 72 20 66 69 72 73 74 20 3d 20 74 61 67 2e  var first = tag.
a050: 72 6f 6f 74 2e 66 69 72 73 74 45 6c 65 6d 65 6e  root.firstElemen
a060: 74 43 68 69 6c 64 0a 20 20 20 20 65 78 70 65 63  tChild.    expec
a070: 74 28 66 69 72 73 74 2e 74 61 67 4e 61 6d 65 29  t(first.tagName)
a080: 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27 50 27  .to.be.equal('P'
a090: 29 0a 20 20 20 20 65 78 70 65 63 74 28 66 69 72  ).    expect(fir
a0a0: 73 74 2e 69 6e 6e 65 72 48 54 4d 4c 29 2e 74 6f  st.innerHTML).to
a0b0: 2e 62 65 2e 65 71 75 61 6c 28 27 79 69 65 6c 64  .be.equal('yield
a0c0: 65 64 20 64 61 74 61 27 29 0a 0a 20 20 20 20 74  ed data')..    t
a0d0: 61 67 2e 72 65 6e 64 65 72 20 3d 20 27 78 74 61  ag.render = 'xta
a0e0: 67 27 0a 20 20 20 20 74 61 67 2e 75 70 64 61 74  g'.    tag.updat
a0f0: 65 28 29 0a 20 20 20 20 66 69 72 73 74 20 3d 20  e().    first = 
a100: 74 61 67 2e 72 6f 6f 74 2e 66 69 72 73 74 45 6c  tag.root.firstEl
a110: 65 6d 65 6e 74 43 68 69 6c 64 0a 20 20 20 20 65  ementChild.    e
a120: 78 70 65 63 74 28 66 69 72 73 74 2e 74 61 67 4e  xpect(first.tagN
a130: 61 6d 65 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c  ame).to.be.equal
a140: 28 27 53 50 41 4e 27 29 0a 20 20 20 20 65 78 70  ('SPAN').    exp
a150: 65 63 74 28 66 69 72 73 74 2e 69 6e 6e 65 72 48  ect(first.innerH
a160: 54 4d 4c 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c  TML).to.be.equal
a170: 28 27 76 69 72 74 75 61 6c 20 64 61 74 61 2d 69  ('virtual data-i
a180: 73 27 29 0a 0a 20 20 20 20 74 61 67 2e 75 6e 6d  s')..    tag.unm
a190: 6f 75 6e 74 28 29 0a 20 20 7d 29 0a 0a 20 20 69  ount().  })..  i
a1a0: 74 28 27 6e 65 73 74 65 64 20 64 79 6e 61 6d 69  t('nested dynami
a1b0: 63 20 74 61 67 73 20 72 65 74 61 69 6e 20 64 61  c tags retain da
a1c0: 74 61 2d 69 73 20 61 74 74 72 69 62 75 74 65 27  ta-is attribute'
a1d0: 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20  , function() {. 
a1e0: 20 20 20 69 6e 6a 65 63 74 48 54 4d 4c 28 27 3c     injectHTML('<
a1f0: 64 79 6e 61 6d 69 63 2d 6e 65 73 74 65 64 3e 3c  dynamic-nested><
a200: 2f 64 79 6e 61 6d 69 63 2d 6e 65 73 74 65 64 3e  /dynamic-nested>
a210: 27 29 0a 20 20 20 20 76 61 72 20 74 61 67 20 3d  ').    var tag =
a220: 20 72 69 6f 74 2e 6d 6f 75 6e 74 28 27 64 79 6e   riot.mount('dyn
a230: 61 6d 69 63 2d 6e 65 73 74 65 64 27 29 5b 30 5d  amic-nested')[0]
a240: 0a 0a 20 20 20 20 65 78 70 65 63 74 28 74 61 67  ..    expect(tag
a250: 2e 72 65 66 73 2e 64 79 6e 61 6d 69 63 2e 72 6f  .refs.dynamic.ro
a260: 6f 74 2e 67 65 74 41 74 74 72 69 62 75 74 65 28  ot.getAttribute(
a270: 27 64 61 74 61 2d 69 73 27 29 29 2e 74 6f 2e 62  'data-is')).to.b
a280: 65 2e 65 71 75 61 6c 28 27 70 61 67 65 2d 61 27  e.equal('page-a'
a290: 29 0a 20 20 20 20 65 78 70 65 63 74 28 74 61 67  ).    expect(tag
a2a0: 2e 74 61 67 73 5b 27 70 61 67 65 2d 61 27 5d 2e  .tags['page-a'].
a2b0: 72 6f 6f 74 2e 71 75 65 72 79 53 65 6c 65 63 74  root.querySelect
a2c0: 6f 72 28 27 68 31 27 29 2e 69 6e 6e 65 72 48 54  or('h1').innerHT
a2d0: 4d 4c 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28  ML).to.be.equal(
a2e0: 27 70 61 67 65 2d 61 27 29 0a 0a 20 20 20 20 74  'page-a')..    t
a2f0: 61 67 2e 70 61 67 65 20 3d 20 27 70 61 67 65 2d  ag.page = 'page-
a300: 62 27 0a 20 20 20 20 74 61 67 2e 75 70 64 61 74  b'.    tag.updat
a310: 65 28 29 0a 20 20 20 20 65 78 70 65 63 74 28 74  e().    expect(t
a320: 61 67 2e 72 65 66 73 2e 64 79 6e 61 6d 69 63 2e  ag.refs.dynamic.
a330: 72 6f 6f 74 2e 67 65 74 41 74 74 72 69 62 75 74  root.getAttribut
a340: 65 28 27 64 61 74 61 2d 69 73 27 29 29 2e 74 6f  e('data-is')).to
a350: 2e 62 65 2e 65 71 75 61 6c 28 27 70 61 67 65 2d  .be.equal('page-
a360: 62 27 29 0a 20 20 20 20 65 78 70 65 63 74 28 74  b').    expect(t
a370: 61 67 2e 74 61 67 73 5b 27 70 61 67 65 2d 62 27  ag.tags['page-b'
a380: 5d 2e 72 6f 6f 74 2e 71 75 65 72 79 53 65 6c 65  ].root.querySele
a390: 63 74 6f 72 28 27 68 31 27 29 2e 69 6e 6e 65 72  ctor('h1').inner
a3a0: 48 54 4d 4c 29 2e 74 6f 2e 62 65 2e 65 71 75 61  HTML).to.be.equa
a3b0: 6c 28 27 70 61 67 65 2d 62 27 29 0a 0a 20 20 20  l('page-b')..   
a3c0: 20 74 61 67 2e 75 6e 6d 6f 75 6e 74 28 29 0a 20   tag.unmount(). 
a3d0: 20 7d 29 0a 0a 20 20 69 74 28 27 76 69 72 74 75   })..  it('virtu
a3e0: 61 6c 20 74 61 67 73 20 77 69 74 68 20 63 6f 6e  al tags with con
a3f0: 64 69 74 69 6f 6e 61 6c 20 77 69 6c 6c 20 6d 6f  ditional will mo
a400: 75 6e 74 20 74 68 65 69 72 20 63 68 69 6c 64 72  unt their childr
a410: 65 6e 20 74 61 67 73 20 70 72 6f 70 65 72 6c 79  en tags properly
a420: 27 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a  ', function() {.
a430: 20 20 20 20 69 6e 6a 65 63 74 48 54 4d 4c 28 27      injectHTML('
a440: 3c 76 69 72 74 75 61 6c 2d 63 6f 6e 64 69 74 69  <virtual-conditi
a450: 6f 6e 61 6c 3e 3c 2f 76 69 72 74 75 61 6c 2d 63  onal></virtual-c
a460: 6f 6e 64 69 74 69 6f 6e 61 6c 3e 27 29 0a 20 20  onditional>').  
a470: 20 20 76 61 72 20 74 61 67 20 3d 20 72 69 6f 74    var tag = riot
a480: 2e 6d 6f 75 6e 74 28 27 76 69 72 74 75 61 6c 2d  .mount('virtual-
a490: 63 6f 6e 64 69 74 69 6f 6e 61 6c 27 29 5b 30 5d  conditional')[0]
a4a0: 0a 0a 20 20 20 20 72 69 6f 74 2e 75 74 69 6c 2e  ..    riot.util.
a4b0: 74 6d 70 6c 2e 65 72 72 6f 72 48 61 6e 64 6c 65  tmpl.errorHandle
a4c0: 72 20 3d 20 66 75 6e 63 74 69 6f 6e 20 28 29 20  r = function () 
a4d0: 7b 0a 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65  {.      throw ne
a4e0: 77 20 45 72 72 6f 72 28 27 49 74 20 73 68 6f 75  w Error('It shou
a4f0: 6c 64 20 72 65 6e 64 65 72 20 77 69 74 68 6f 75  ld render withou
a500: 74 20 65 72 72 6f 72 73 27 29 0a 20 20 20 20 7d  t errors').    }
a510: 0a 0a 20 20 20 20 65 78 70 65 63 74 28 74 61 67  ..    expect(tag
a520: 2e 63 68 69 6c 64 4d 6f 75 6e 74 43 6f 75 6e 74  .childMountCount
a530: 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 30 29  ).to.be.equal(0)
a540: 0a 20 20 20 20 74 61 67 2e 75 73 65 72 20 3d 20  .    tag.user = 
a550: 7b 20 6e 61 6d 65 3a 20 27 66 6f 6f 27 20 7d 0a  { name: 'foo' }.
a560: 0a 20 20 20 20 74 61 67 2e 75 70 64 61 74 65 28  .    tag.update(
a570: 29 0a 20 20 20 20 65 78 70 65 63 74 28 74 61 67  ).    expect(tag
a580: 2e 63 68 69 6c 64 4d 6f 75 6e 74 43 6f 75 6e 74  .childMountCount
a590: 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 31 29  ).to.be.equal(1)
a5a0: 0a 0a 20 20 20 20 72 69 6f 74 2e 75 74 69 6c 2e  ..    riot.util.
a5b0: 74 6d 70 6c 2e 65 72 72 6f 72 48 61 6e 64 6c 65  tmpl.errorHandle
a5c0: 72 20 3d 20 6e 75 6c 6c 0a 0a 20 20 20 20 74 61  r = null..    ta
a5d0: 67 2e 75 6e 6d 6f 75 6e 74 28 29 0a 0a 20 20 7d  g.unmount()..  }
a5e0: 29 0a 0a 20 20 69 74 28 27 74 68 65 20 76 61 6c  )..  it('the val
a5f0: 75 65 20 61 74 74 72 69 62 75 74 65 20 6f 6e 20  ue attribute on 
a600: 61 20 72 69 6f 74 20 74 61 67 20 67 65 74 73 20  a riot tag gets 
a610: 70 72 6f 70 65 72 6c 79 20 70 61 73 73 65 64 20  properly passed 
a620: 61 73 20 6f 70 74 69 6f 6e 27 2c 20 66 75 6e 63  as option', func
a630: 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20 69 6e 6a  tion() {.    inj
a640: 65 63 74 48 54 4d 4c 28 27 3c 72 69 6f 74 2d 74  ectHTML('<riot-t
a650: 6d 70 2d 76 61 6c 75 65 3e 3c 2f 72 69 6f 74 2d  mp-value></riot-
a660: 74 6d 70 2d 76 61 6c 75 65 3e 27 29 0a 20 20 20  tmp-value>').   
a670: 20 72 69 6f 74 2e 74 61 67 28 27 72 69 6f 74 2d   riot.tag('riot-
a680: 74 6d 70 27 2c 20 27 3c 70 3e 7b 20 6f 70 74 73  tmp', '<p>{ opts
a690: 2e 76 61 6c 75 65 20 7d 3c 2f 70 3e 27 29 0a 20  .value }</p>'). 
a6a0: 20 20 20 72 69 6f 74 2e 74 61 67 28 27 72 69 6f     riot.tag('rio
a6b0: 74 2d 74 6d 70 2d 76 61 6c 75 65 27 2c 20 27 3c  t-tmp-value', '<
a6c0: 72 69 6f 74 2d 74 6d 70 20 76 61 6c 75 65 3d 22  riot-tmp value="
a6d0: 7b 20 76 61 6c 75 65 20 7d 22 3e 3c 2f 72 69 6f  { value }"></rio
a6e0: 74 2d 74 6d 70 3e 27 2c 20 66 75 6e 63 74 69 6f  t-tmp>', functio
a6f0: 6e 28 29 20 7b 0a 20 20 20 20 20 20 74 68 69 73  n() {.      this
a700: 2e 76 61 6c 75 65 20 3d 20 27 66 6f 6f 27 0a 20  .value = 'foo'. 
a710: 20 20 20 7d 29 0a 20 20 20 20 76 61 72 20 74 61     }).    var ta
a720: 67 20 3d 20 72 69 6f 74 2e 6d 6f 75 6e 74 28 27  g = riot.mount('
a730: 72 69 6f 74 2d 74 6d 70 2d 76 61 6c 75 65 27 29  riot-tmp-value')
a740: 5b 30 5d 0a 20 20 20 20 65 78 70 65 63 74 28 74  [0].    expect(t
a750: 61 67 2e 74 61 67 73 5b 27 72 69 6f 74 2d 74 6d  ag.tags['riot-tm
a760: 70 27 5d 2e 6f 70 74 73 2e 76 61 6c 75 65 29 2e  p'].opts.value).
a770: 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27 66 6f 6f  to.be.equal('foo
a780: 27 29 0a 20 20 20 20 65 78 70 65 63 74 28 74 61  ').    expect(ta
a790: 67 2e 74 61 67 73 5b 27 72 69 6f 74 2d 74 6d 70  g.tags['riot-tmp
a7a0: 27 5d 2e 6f 70 74 73 2e 72 69 6f 74 56 61 6c 75  '].opts.riotValu
a7b0: 65 29 2e 74 6f 2e 62 65 2e 6e 6f 74 2e 6f 6b 0a  e).to.be.not.ok.
a7c0: 20 20 20 20 74 61 67 2e 75 6e 6d 6f 75 6e 74 28      tag.unmount(
a7d0: 29 0a 20 20 7d 29 0a 0a 20 20 69 74 28 27 74 68  ).  })..  it('th
a7e0: 65 20 6e 75 6c 6c 20 61 74 74 72 69 62 75 74 65  e null attribute
a7f0: 73 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 74 20  s should be not 
a800: 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 20 65  transformed to e
a810: 6d 70 74 79 20 73 74 72 69 6e 67 73 27 2c 20 66  mpty strings', f
a820: 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20  unction() {.    
a830: 69 6e 6a 65 63 74 48 54 4d 4c 28 27 3c 72 69 6f  injectHTML('<rio
a840: 74 2d 74 6d 70 2d 76 61 6c 75 65 3e 3c 2f 72 69  t-tmp-value></ri
a850: 6f 74 2d 74 6d 70 2d 76 61 6c 75 65 3e 27 29 0a  ot-tmp-value>').
a860: 20 20 20 20 72 69 6f 74 2e 74 61 67 28 27 72 69      riot.tag('ri
a870: 6f 74 2d 74 6d 70 27 2c 20 27 3c 70 3e 7b 20 6f  ot-tmp', '<p>{ o
a880: 70 74 73 2e 76 61 6c 75 65 20 7d 3c 2f 70 3e 27  pts.value }</p>'
a890: 29 0a 20 20 20 20 72 69 6f 74 2e 74 61 67 28 27  ).    riot.tag('
a8a0: 72 69 6f 74 2d 74 6d 70 2d 76 61 6c 75 65 27 2c  riot-tmp-value',
a8b0: 20 27 3c 72 69 6f 74 2d 74 6d 70 20 76 61 6c 75   '<riot-tmp valu
a8c0: 65 3d 22 7b 20 6e 75 6c 6c 20 7d 22 20 76 61 6c  e="{ null }" val
a8d0: 75 65 32 3d 22 7b 20 75 6e 64 65 66 69 6e 65 64  ue2="{ undefined
a8e0: 20 7d 22 3e 3c 2f 72 69 6f 74 2d 74 6d 70 3e 27   }"></riot-tmp>'
a8f0: 29 0a 20 20 20 20 76 61 72 20 74 61 67 20 3d 20  ).    var tag = 
a900: 72 69 6f 74 2e 6d 6f 75 6e 74 28 27 72 69 6f 74  riot.mount('riot
a910: 2d 74 6d 70 2d 76 61 6c 75 65 27 29 5b 30 5d 0a  -tmp-value')[0].
a920: 20 20 20 20 65 78 70 65 63 74 28 74 61 67 2e 74      expect(tag.t
a930: 61 67 73 5b 27 72 69 6f 74 2d 74 6d 70 27 5d 2e  ags['riot-tmp'].
a940: 6f 70 74 73 2e 76 61 6c 75 65 29 2e 74 6f 2e 62  opts.value).to.b
a950: 65 2e 65 71 75 61 6c 28 6e 75 6c 6c 29 0a 20 20  e.equal(null).  
a960: 20 20 65 78 70 65 63 74 28 74 61 67 2e 74 61 67    expect(tag.tag
a970: 73 5b 27 72 69 6f 74 2d 74 6d 70 27 5d 2e 6f 70  s['riot-tmp'].op
a980: 74 73 2e 76 61 6c 75 65 32 29 2e 74 6f 2e 62 65  ts.value2).to.be
a990: 2e 65 71 75 61 6c 28 75 6e 64 65 66 69 6e 65 64  .equal(undefined
a9a0: 29 0a 20 20 20 20 74 61 67 2e 75 6e 6d 6f 75 6e  ).    tag.unmoun
a9b0: 74 28 29 0a 20 20 7d 29 0a 0a 20 20 69 74 28 27  t().  })..  it('
a9c0: 73 74 79 6c 65 20 70 72 6f 70 65 72 74 69 65 73  style properties
a9d0: 20 63 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64   could be passed
a9e0: 20 61 6c 73 6f 20 61 73 20 6f 62 6a 65 63 74 27   also as object'
a9f0: 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20  , function() {. 
aa00: 20 20 20 69 6e 6a 65 63 74 48 54 4d 4c 28 27 3c     injectHTML('<
aa10: 72 69 6f 74 2d 74 6d 70 3e 3c 2f 72 69 6f 74 2d  riot-tmp></riot-
aa20: 74 6d 70 3e 27 29 0a 20 20 20 20 72 69 6f 74 2e  tmp>').    riot.
aa30: 74 61 67 28 27 72 69 6f 74 2d 74 6d 70 27 2c 20  tag('riot-tmp', 
aa40: 27 3c 70 20 72 69 6f 74 2d 73 74 79 6c 65 3d 22  '<p riot-style="
aa50: 7b 20 73 74 79 6c 65 20 7d 22 3e 68 69 3c 2f 70  { style }">hi</p
aa60: 3e 27 29 0a 20 20 20 20 76 61 72 20 74 61 67 20  >').    var tag 
aa70: 3d 20 72 69 6f 74 2e 6d 6f 75 6e 74 28 27 72 69  = riot.mount('ri
aa80: 6f 74 2d 74 6d 70 27 29 5b 30 5d 2c 0a 20 20 20  ot-tmp')[0],.   
aa90: 20 20 20 70 20 3d 20 24 28 27 70 27 2c 20 74 68     p = $('p', th
aaa0: 69 73 2e 72 6f 6f 74 29 0a 0a 20 20 20 20 74 61  is.root)..    ta
aab0: 67 2e 73 74 79 6c 65 20 3d 20 7b 20 63 6f 6c 6f  g.style = { colo
aac0: 72 3a 20 27 72 65 64 27 2c 20 68 65 69 67 68 74  r: 'red', height
aad0: 3a 20 27 31 30 70 78 27 7d 0a 20 20 20 20 74 61  : '10px'}.    ta
aae0: 67 2e 75 70 64 61 74 65 28 29 0a 0a 20 20 20 20  g.update()..    
aaf0: 65 78 70 65 63 74 28 70 2e 73 74 79 6c 65 2e 63  expect(p.style.c
ab00: 6f 6c 6f 72 29 2e 74 6f 2e 62 65 2e 65 71 75 61  olor).to.be.equa
ab10: 6c 28 27 72 65 64 27 29 0a 20 20 20 20 65 78 70  l('red').    exp
ab20: 65 63 74 28 70 2e 73 74 79 6c 65 2e 68 65 69 67  ect(p.style.heig
ab30: 68 74 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28  ht).to.be.equal(
ab40: 27 31 30 70 78 27 29 0a 0a 20 20 20 20 74 61 67  '10px')..    tag
ab50: 2e 75 6e 6d 6f 75 6e 74 28 29 0a 20 20 7d 29 0a  .unmount().  }).
ab60: 0a 0a 20 20 69 74 28 27 63 6c 61 73 73 20 70 72  ..  it('class pr
ab70: 6f 70 65 72 74 69 65 73 20 63 6f 75 6c 64 20 62  operties could b
ab80: 65 20 70 61 73 73 65 64 20 61 6c 73 6f 20 61 73  e passed also as
ab90: 20 6f 62 6a 65 63 74 27 2c 20 66 75 6e 63 74 69   object', functi
aba0: 6f 6e 28 29 20 7b 0a 20 20 20 20 69 6e 6a 65 63  on() {.    injec
abb0: 74 48 54 4d 4c 28 27 3c 72 69 6f 74 2d 74 6d 70  tHTML('<riot-tmp
abc0: 3e 3c 2f 72 69 6f 74 2d 74 6d 70 3e 27 29 0a 20  ></riot-tmp>'). 
abd0: 20 20 20 72 69 6f 74 2e 74 61 67 28 27 72 69 6f     riot.tag('rio
abe0: 74 2d 74 6d 70 27 2c 20 27 3c 70 20 63 6c 61 73  t-tmp', '<p clas
abf0: 73 3d 22 7b 20 63 6c 61 73 73 65 73 20 7d 22 3e  s="{ classes }">
ac00: 68 69 3c 2f 70 3e 27 29 0a 20 20 20 20 76 61 72  hi</p>').    var
ac10: 20 74 61 67 20 3d 20 72 69 6f 74 2e 6d 6f 75 6e   tag = riot.moun
ac20: 74 28 27 72 69 6f 74 2d 74 6d 70 27 29 5b 30 5d  t('riot-tmp')[0]
ac30: 2c 0a 20 20 20 20 20 20 70 20 3d 20 24 28 27 70  ,.      p = $('p
ac40: 27 2c 20 74 68 69 73 2e 72 6f 6f 74 29 0a 0a 20  ', this.root).. 
ac50: 20 20 20 74 61 67 2e 63 6c 61 73 73 65 73 20 3d     tag.classes =
ac60: 20 7b 20 66 6f 6f 3a 20 74 72 75 65 2c 20 62 61   { foo: true, ba
ac70: 72 3a 20 66 61 6c 73 65 20 7d 0a 20 20 20 20 74  r: false }.    t
ac80: 61 67 2e 75 70 64 61 74 65 28 29 0a 20 20 20 20  ag.update().    
ac90: 65 78 70 65 63 74 28 70 2e 67 65 74 41 74 74 72  expect(p.getAttr
aca0: 69 62 75 74 65 28 27 63 6c 61 73 73 27 29 29 2e  ibute('class')).
acb0: 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27 66 6f 6f  to.be.equal('foo
acc0: 27 29 0a 20 20 20 20 74 61 67 2e 63 6c 61 73 73  ').    tag.class
acd0: 65 73 20 3d 20 7b 20 66 6f 6f 3a 20 74 72 75 65  es = { foo: true
ace0: 2c 20 62 61 72 3a 20 74 72 75 65 20 7d 0a 20 20  , bar: true }.  
acf0: 20 20 74 61 67 2e 75 70 64 61 74 65 28 29 0a 20    tag.update(). 
ad00: 20 20 20 65 78 70 65 63 74 28 70 2e 67 65 74 41     expect(p.getA
ad10: 74 74 72 69 62 75 74 65 28 27 63 6c 61 73 73 27  ttribute('class'
ad20: 29 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27  )).to.be.equal('
ad30: 66 6f 6f 20 62 61 72 27 29 0a 20 20 20 20 74 61  foo bar').    ta
ad40: 67 2e 75 6e 6d 6f 75 6e 74 28 29 0a 20 20 7d 29  g.unmount().  })
ad50: 0a 0a 20 20 69 74 28 27 75 6e 64 65 66 69 6e 65  ..  it('undefine
ad60: 64 20 74 65 78 74 20 6e 6f 64 65 20 73 68 6f 75  d text node shou
ad70: 6c 64 20 6e 6f 74 20 62 65 20 72 65 6e 64 65 72  ld not be render
ad80: 65 64 27 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20  ed', function() 
ad90: 7b 0a 20 20 20 20 69 6e 6a 65 63 74 48 54 4d 4c  {.    injectHTML
ada0: 28 27 3c 72 69 6f 74 2d 74 6d 70 3e 3c 2f 72 69  ('<riot-tmp></ri
adb0: 6f 74 2d 74 6d 70 3e 27 29 0a 20 20 20 20 72 69  ot-tmp>').    ri
adc0: 6f 74 2e 74 61 67 28 27 72 69 6f 74 2d 74 6d 70  ot.tag('riot-tmp
add0: 27 2c 20 27 3c 70 3e 7b 20 6d 65 73 73 61 67 65  ', '<p>{ message
ade0: 20 7d 3c 2f 70 3e 27 29 0a 0a 20 20 20 20 76 61   }</p>')..    va
adf0: 72 20 74 61 67 20 3d 20 72 69 6f 74 2e 6d 6f 75  r tag = riot.mou
ae00: 6e 74 28 27 72 69 6f 74 2d 74 6d 70 27 29 5b 30  nt('riot-tmp')[0
ae10: 5d 2c 0a 20 20 20 20 20 20 70 20 3d 20 24 28 27  ],.      p = $('
ae20: 70 27 2c 20 74 68 69 73 2e 72 6f 6f 74 29 0a 0a  p', this.root)..
ae30: 20 20 20 20 65 78 70 65 63 74 28 70 2e 69 6e 6e      expect(p.inn
ae40: 65 72 48 54 4d 4c 29 2e 74 6f 2e 62 65 2e 6e 6f  erHTML).to.be.no
ae50: 74 2e 65 71 75 61 6c 28 27 75 6e 64 65 66 69 6e  t.equal('undefin
ae60: 65 64 27 29 0a 0a 20 20 20 20 74 61 67 2e 75 6e  ed')..    tag.un
ae70: 6d 6f 75 6e 74 28 29 0a 20 20 7d 29 0a 0a 20 20  mount().  })..  
ae80: 69 74 28 27 73 75 62 74 61 67 73 20 63 72 65 61  it('subtags crea
ae90: 74 65 64 20 76 69 61 20 69 73 20 67 65 74 20 70  ted via is get p
aea0: 72 6f 70 65 72 6c 79 20 75 6e 6d 6f 75 6e 74 65  roperly unmounte
aeb0: 64 27 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b  d', function() {
aec0: 0a 20 20 20 20 69 6e 6a 65 63 74 48 54 4d 4c 28  .    injectHTML(
aed0: 27 3c 72 69 6f 74 2d 74 6d 70 3e 3c 2f 72 69 6f  '<riot-tmp></rio
aee0: 74 2d 74 6d 70 3e 27 29 0a 20 20 20 20 72 69 6f  t-tmp>').    rio
aef0: 74 2e 74 61 67 28 27 72 69 6f 74 2d 74 6d 70 2d  t.tag('riot-tmp-
af00: 73 75 62 27 2c 20 27 3c 70 3e 68 69 3c 2f 70 3e  sub', '<p>hi</p>
af10: 27 29 0a 20 20 20 20 72 69 6f 74 2e 74 61 67 28  ').    riot.tag(
af20: 27 72 69 6f 74 2d 74 6d 70 27 2c 20 27 3c 64 69  'riot-tmp', '<di
af30: 76 20 69 66 3d 22 7b 20 73 68 6f 77 53 75 62 20  v if="{ showSub 
af40: 7d 22 3e 3c 64 69 76 20 64 61 74 61 2d 69 73 3d  }"><div data-is=
af50: 22 7b 20 73 75 62 54 61 67 20 7d 22 3e 3c 2f 64  "{ subTag }"></d
af60: 69 76 3e 3c 2f 64 69 76 3e 27 29 0a 0a 20 20 20  iv></div>')..   
af70: 20 76 61 72 20 74 61 67 20 3d 20 72 69 6f 74 2e   var tag = riot.
af80: 6d 6f 75 6e 74 28 27 72 69 6f 74 2d 74 6d 70 27  mount('riot-tmp'
af90: 29 5b 30 5d 2c 0a 20 20 20 20 20 20 75 6e 6d 6f  )[0],.      unmo
afa0: 75 6e 74 20 3d 20 73 69 6e 6f 6e 2e 73 70 79 28  unt = sinon.spy(
afb0: 29 0a 0a 20 20 20 20 65 78 70 65 63 74 28 74 61  )..    expect(ta
afc0: 67 2e 74 61 67 73 5b 27 72 69 6f 74 2d 74 6d 70  g.tags['riot-tmp
afd0: 2d 73 75 62 27 5d 29 2e 74 6f 2e 62 65 2e 6e 6f  -sub']).to.be.no
afe0: 74 2e 6f 6b 0a 0a 20 20 20 20 74 61 67 2e 73 68  t.ok..    tag.sh
aff0: 6f 77 53 75 62 20 3d 20 74 72 75 65 0a 20 20 20  owSub = true.   
b000: 20 74 61 67 2e 73 75 62 54 61 67 20 3d 20 27 72   tag.subTag = 'r
b010: 69 6f 74 2d 74 6d 70 2d 73 75 62 27 0a 20 20 20  iot-tmp-sub'.   
b020: 20 74 61 67 2e 75 70 64 61 74 65 28 29 0a 0a 20   tag.update().. 
b030: 20 20 20 65 78 70 65 63 74 28 74 61 67 2e 74 61     expect(tag.ta
b040: 67 73 5b 27 72 69 6f 74 2d 74 6d 70 2d 73 75 62  gs['riot-tmp-sub
b050: 27 5d 29 2e 74 6f 2e 62 65 2e 6f 6b 0a 20 20 20  ']).to.be.ok.   
b060: 20 74 61 67 2e 74 61 67 73 5b 27 72 69 6f 74 2d   tag.tags['riot-
b070: 74 6d 70 2d 73 75 62 27 5d 2e 6f 6e 28 27 75 6e  tmp-sub'].on('un
b080: 6d 6f 75 6e 74 27 2c 20 75 6e 6d 6f 75 6e 74 29  mount', unmount)
b090: 0a 0a 20 20 20 20 74 61 67 2e 73 68 6f 77 53 75  ..    tag.showSu
b0a0: 62 20 3d 20 66 61 6c 73 65 0a 20 20 20 20 74 61  b = false.    ta
b0b0: 67 2e 75 70 64 61 74 65 28 29 0a 0a 20 20 20 20  g.update()..    
b0c0: 65 78 70 65 63 74 28 74 61 67 2e 74 61 67 73 5b  expect(tag.tags[
b0d0: 27 72 69 6f 74 2d 74 6d 70 2d 73 75 62 27 5d 29  'riot-tmp-sub'])
b0e0: 2e 74 6f 2e 62 65 2e 6e 6f 74 2e 6f 6b 0a 20 20  .to.be.not.ok.  
b0f0: 20 20 65 78 70 65 63 74 28 75 6e 6d 6f 75 6e 74    expect(unmount
b100: 29 2e 74 6f 2e 68 61 76 65 2e 62 65 65 6e 2e 63  ).to.have.been.c
b110: 61 6c 6c 65 64 0a 0a 20 20 20 20 74 61 67 2e 75  alled..    tag.u
b120: 6e 6d 6f 75 6e 74 28 29 0a 20 20 7d 29 0a 0a 20  nmount().  }).. 
b130: 20 69 74 28 27 72 69 6f 74 20 63 61 6e 20 6d 6f   it('riot can mo
b140: 75 6e 74 20 61 6c 73 6f 20 69 6e 6c 69 6e 65 20  unt also inline 
b150: 74 65 6d 70 6c 61 74 65 73 27 2c 20 66 75 6e 63  templates', func
b160: 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20 69 6e 6a  tion() {.    inj
b170: 65 63 74 48 54 4d 4c 28 60 0a 20 20 20 20 20 20  ectHTML(`.      
b180: 3c 72 69 6f 74 2d 74 6d 70 3e 0a 20 20 20 20 20  <riot-tmp>.     
b190: 20 20 20 3c 70 20 72 65 66 3d 22 6d 65 73 22 3e     <p ref="mes">
b1a0: 7b 20 6d 65 73 73 61 67 65 20 7d 3c 2f 70 3e 0a  { message }</p>.
b1b0: 20 20 20 20 20 20 20 20 3c 72 69 6f 74 2d 74 6d          <riot-tm
b1c0: 70 2d 73 75 62 20 72 65 66 3d 22 73 75 62 22 20  p-sub ref="sub" 
b1d0: 6d 65 73 73 61 67 65 3d 22 7b 20 6d 65 73 73 61  message="{ messa
b1e0: 67 65 20 7d 22 3e 0a 20 20 20 20 20 20 20 20 20  ge }">.         
b1f0: 20 3c 70 20 72 65 66 3d 22 6d 65 73 22 3e 7b 20   <p ref="mes">{ 
b200: 6d 65 73 73 61 67 65 20 7d 3c 2f 70 3e 0a 20 20  message }</p>.  
b210: 20 20 20 20 20 20 3c 2f 72 69 6f 74 2d 74 6d 70        </riot-tmp
b220: 2d 73 75 62 3e 0a 20 20 20 20 20 20 3c 2f 72 69  -sub>.      </ri
b230: 6f 74 2d 74 6d 70 3e 60 29 0a 0a 20 20 20 20 72  ot-tmp>`)..    r
b240: 69 6f 74 2e 74 61 67 28 27 72 69 6f 74 2d 74 6d  iot.tag('riot-tm
b250: 70 27 2c 20 66 61 6c 73 65 2c 20 66 75 6e 63 74  p', false, funct
b260: 69 6f 6e 28 29 20 7b 0a 20 20 20 20 20 20 74 68  ion() {.      th
b270: 69 73 2e 6d 65 73 73 61 67 65 20 3d 20 27 68 65  is.message = 'he
b280: 6c 6c 6f 27 0a 20 20 20 20 7d 29 0a 0a 20 20 20  llo'.    })..   
b290: 20 72 69 6f 74 2e 74 61 67 28 27 72 69 6f 74 2d   riot.tag('riot-
b2a0: 74 6d 70 2d 73 75 62 27 2c 20 66 61 6c 73 65 2c  tmp-sub', false,
b2b0: 20 66 75 6e 63 74 69 6f 6e 28 6f 70 74 73 29 20   function(opts) 
b2c0: 7b 0a 20 20 20 20 20 20 74 68 69 73 2e 6d 65 73  {.      this.mes
b2d0: 73 61 67 65 20 3d 20 6f 70 74 73 2e 6d 65 73 73  sage = opts.mess
b2e0: 61 67 65 0a 20 20 20 20 7d 29 0a 0a 20 20 20 20  age.    })..    
b2f0: 76 61 72 20 74 61 67 20 3d 20 72 69 6f 74 2e 6d  var tag = riot.m
b300: 6f 75 6e 74 28 27 72 69 6f 74 2d 74 6d 70 27 29  ount('riot-tmp')
b310: 5b 30 5d 0a 0a 20 20 20 20 65 78 70 65 63 74 28  [0]..    expect(
b320: 74 61 67 2e 72 65 66 73 2e 6d 65 73 2e 69 6e 6e  tag.refs.mes.inn
b330: 65 72 48 54 4d 4c 29 2e 74 6f 2e 62 65 2e 65 71  erHTML).to.be.eq
b340: 75 61 6c 28 74 61 67 2e 6d 65 73 73 61 67 65 29  ual(tag.message)
b350: 0a 20 20 20 20 65 78 70 65 63 74 28 74 61 67 2e  .    expect(tag.
b360: 72 65 66 73 2e 73 75 62 2e 72 65 66 73 2e 6d 65  refs.sub.refs.me
b370: 73 2e 69 6e 6e 65 72 48 54 4d 4c 29 2e 74 6f 2e  s.innerHTML).to.
b380: 62 65 2e 65 71 75 61 6c 28 74 61 67 2e 6d 65 73  be.equal(tag.mes
b390: 73 61 67 65 29 0a 0a 20 20 20 20 74 61 67 2e 75  sage)..    tag.u
b3a0: 6e 6d 6f 75 6e 74 28 29 0a 20 20 7d 29 0a 0a 0a  nmount().  })...
b3b0: 20 20 69 74 28 27 74 61 67 73 20 69 6e 20 61 6e    it('tags in an
b3c0: 20 73 76 67 20 63 6f 6e 74 65 78 74 20 61 72 65   svg context are
b3d0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
b3e0: 65 74 65 63 74 65 64 20 61 6e 64 20 70 72 6f 70  etected and prop
b3f0: 65 72 6c 79 20 63 72 65 61 74 65 64 20 73 65 65  erly created see
b400: 20 23 32 32 39 30 27 2c 20 66 75 6e 63 74 69 6f   #2290', functio
b410: 6e 28 29 20 7b 0a 20 20 20 20 69 6e 6a 65 63 74  n() {.    inject
b420: 48 54 4d 4c 28 27 3c 73 76 67 20 69 64 3d 22 74  HTML('<svg id="t
b430: 6d 70 73 76 67 22 3e 3c 67 20 64 61 74 61 2d 69  mpsvg"><g data-i
b440: 73 3d 22 72 69 6f 74 2d 74 6d 70 22 3e 3c 2f 67  s="riot-tmp"></g
b450: 3e 3c 2f 73 76 67 3e 27 29 0a 0a 20 20 20 20 72  ></svg>')..    r
b460: 69 6f 74 2e 74 61 67 28 27 72 69 6f 74 2d 74 6d  iot.tag('riot-tm
b470: 70 27 2c 20 27 3c 63 69 72 63 6c 65 20 72 69 6f  p', '<circle rio
b480: 74 2d 63 78 3d 22 7b 20 31 30 20 2b 20 35 20 7d  t-cx="{ 10 + 5 }
b490: 22 20 72 69 6f 74 2d 63 79 3d 22 7b 20 31 30 20  " riot-cy="{ 10 
b4a0: 2b 20 35 20 7d 22 20 72 3d 22 32 22 20 66 69 6c  + 5 }" r="2" fil
b4b0: 6c 3d 22 62 6c 61 63 6b 22 3e 3c 2f 63 69 72 63  l="black"></circ
b4c0: 6c 65 3e 27 29 0a 0a 20 20 20 20 76 61 72 20 74  le>')..    var t
b4d0: 61 67 20 3d 20 72 69 6f 74 2e 6d 6f 75 6e 74 28  ag = riot.mount(
b4e0: 27 72 69 6f 74 2d 74 6d 70 27 29 5b 30 5d 2c 0a  'riot-tmp')[0],.
b4f0: 20 20 20 20 20 20 63 69 72 63 6c 65 20 3d 20 24        circle = $
b500: 28 27 63 69 72 63 6c 65 27 2c 20 74 68 69 73 2e  ('circle', this.
b510: 72 6f 6f 74 29 0a 0a 20 20 20 20 65 78 70 65 63  root)..    expec
b520: 74 28 63 69 72 63 6c 65 20 69 6e 73 74 61 6e 63  t(circle instanc
b530: 65 6f 66 20 48 54 4d 4c 45 6c 65 6d 65 6e 74 29  eof HTMLElement)
b540: 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 66 61 6c  .to.be.equal(fal
b550: 73 65 29 0a 0a 20 20 20 20 74 61 67 2e 75 6e 6d  se)..    tag.unm
b560: 6f 75 6e 74 28 29 0a 20 20 20 20 64 6f 63 75 6d  ount().    docum
b570: 65 6e 74 2e 62 6f 64 79 2e 72 65 6d 6f 76 65 43  ent.body.removeC
b580: 68 69 6c 64 28 77 69 6e 64 6f 77 2e 74 6d 70 73  hild(window.tmps
b590: 76 67 29 0a 20 20 7d 29 0a 0a 20 20 69 74 28 27  vg).  })..  it('
b5a0: 64 69 73 61 62 6c 65 20 74 68 65 20 61 75 74 6f  disable the auto
b5b0: 20 75 70 64 61 74 65 73 20 76 69 61 20 73 65 74   updates via set
b5c0: 74 69 6e 67 73 2e 61 75 74 6f 55 70 64 61 74 65  tings.autoUpdate
b5d0: 20 3d 20 66 61 6c 73 65 27 2c 20 66 75 6e 63 74   = false', funct
b5e0: 69 6f 6e 28 29 20 7b 0a 20 20 20 20 69 6e 6a 65  ion() {.    inje
b5f0: 63 74 48 54 4d 4c 28 27 3c 72 69 6f 74 2d 74 6d  ctHTML('<riot-tm
b600: 70 3e 3c 2f 72 69 6f 74 2d 74 6d 70 3e 27 29 0a  p></riot-tmp>').
b610: 0a 20 20 20 20 72 69 6f 74 2e 74 61 67 28 27 72  .    riot.tag('r
b620: 69 6f 74 2d 74 6d 70 27 2c 20 27 3c 70 20 72 65  iot-tmp', '<p re
b630: 66 3d 22 70 22 20 6f 6e 63 6c 69 63 6b 3d 22 7b  f="p" onclick="{
b640: 20 75 70 64 61 74 65 4d 65 73 73 61 67 65 20 7d   updateMessage }
b650: 22 3e 7b 20 6d 65 73 73 61 67 65 20 7d 3c 2f 70  ">{ message }</p
b660: 3e 27 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b  >', function() {
b670: 0a 20 20 20 20 20 20 74 68 69 73 2e 6d 65 73 73  .      this.mess
b680: 61 67 65 20 3d 20 27 68 69 27 0a 20 20 20 20 20  age = 'hi'.     
b690: 20 74 68 69 73 2e 75 70 64 61 74 65 4d 65 73 73   this.updateMess
b6a0: 61 67 65 20 3d 20 66 75 6e 63 74 69 6f 6e 28 29  age = function()
b6b0: 20 7b 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e   {.        this.
b6c0: 6d 65 73 73 61 67 65 20 3d 20 27 67 6f 6f 64 62  message = 'goodb
b6d0: 79 65 27 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ye'.      }.    
b6e0: 7d 29 0a 0a 20 20 20 20 72 69 6f 74 2e 73 65 74  })..    riot.set
b6f0: 74 69 6e 67 73 2e 61 75 74 6f 55 70 64 61 74 65  tings.autoUpdate
b700: 20 3d 20 66 61 6c 73 65 0a 20 20 20 20 76 61 72   = false.    var
b710: 20 74 61 67 20 3d 20 72 69 6f 74 2e 6d 6f 75 6e   tag = riot.moun
b720: 74 28 27 72 69 6f 74 2d 74 6d 70 27 29 5b 30 5d  t('riot-tmp')[0]
b730: 0a 0a 20 20 20 20 65 78 70 65 63 74 28 74 61 67  ..    expect(tag
b740: 2e 72 65 66 73 2e 70 2e 69 6e 6e 65 72 48 54 4d  .refs.p.innerHTM
b750: 4c 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 74  L).to.be.equal(t
b760: 61 67 2e 6d 65 73 73 61 67 65 29 0a 0a 20 20 20  ag.message)..   
b770: 20 66 69 72 65 45 76 65 6e 74 28 74 61 67 2e 72   fireEvent(tag.r
b780: 65 66 73 2e 70 2c 20 27 63 6c 69 63 6b 27 29 0a  efs.p, 'click').
b790: 0a 20 20 20 20 65 78 70 65 63 74 28 74 61 67 2e  .    expect(tag.
b7a0: 72 65 66 73 2e 70 2e 69 6e 6e 65 72 48 54 4d 4c  refs.p.innerHTML
b7b0: 29 2e 74 6f 2e 62 65 2e 6e 6f 74 2e 65 71 75 61  ).to.be.not.equa
b7c0: 6c 28 74 61 67 2e 6d 65 73 73 61 67 65 29 0a 0a  l(tag.message)..
b7d0: 20 20 20 20 74 61 67 2e 75 6e 6d 6f 75 6e 74 28      tag.unmount(
b7e0: 29 0a 20 20 20 20 72 69 6f 74 2e 73 65 74 74 69  ).    riot.setti
b7f0: 6e 67 73 2e 61 75 74 6f 55 70 64 61 74 65 20 3d  ngs.autoUpdate =
b800: 20 74 72 75 65 0a 20 20 7d 29 0a 0a 20 20 69 74   true.  })..  it
b810: 28 27 75 70 64 61 74 65 73 20 64 75 72 69 6e 67  ('updates during
b820: 20 74 68 65 20 6d 6f 75 6e 74 20 65 76 65 6e 74   the mount event
b830: 20 73 68 6f 75 6c 64 20 70 72 6f 70 65 72 6c 79   should properly
b840: 20 75 70 64 61 74 65 20 74 68 65 20 44 4f 4d 27   update the DOM'
b850: 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20  , function() {. 
b860: 20 20 20 69 6e 6a 65 63 74 48 54 4d 4c 28 27 3c     injectHTML('<
b870: 72 69 6f 74 2d 74 6d 70 3e 3c 2f 72 69 6f 74 2d  riot-tmp></riot-
b880: 74 6d 70 3e 27 29 0a 0a 20 20 20 20 72 69 6f 74  tmp>')..    riot
b890: 2e 74 61 67 28 27 72 69 6f 74 2d 74 6d 70 27 2c  .tag('riot-tmp',
b8a0: 20 27 3c 70 20 72 65 66 3d 22 70 22 3e 7b 20 6d   '<p ref="p">{ m
b8b0: 65 73 73 61 67 65 20 7d 3c 2f 70 3e 27 2c 20 66  essage }</p>', f
b8c0: 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20  unction() {.    
b8d0: 20 20 74 68 69 73 2e 6d 65 73 73 61 67 65 20 3d    this.message =
b8e0: 20 27 68 69 27 0a 20 20 20 20 20 20 74 68 69 73   'hi'.      this
b8f0: 2e 6f 6e 28 27 6d 6f 75 6e 74 27 2c 20 28 29 20  .on('mount', () 
b900: 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 74 68 69  => {.        thi
b910: 73 2e 6d 65 73 73 61 67 65 20 3d 20 27 67 6f 6f  s.message = 'goo
b920: 64 62 79 65 27 0a 20 20 20 20 20 20 20 20 74 68  dbye'.        th
b930: 69 73 2e 75 70 64 61 74 65 28 29 0a 20 20 20 20  is.update().    
b940: 20 20 7d 29 0a 20 20 20 20 7d 29 0a 0a 20 20 20    }).    })..   
b950: 20 76 61 72 20 74 61 67 20 3d 20 72 69 6f 74 2e   var tag = riot.
b960: 6d 6f 75 6e 74 28 27 72 69 6f 74 2d 74 6d 70 27  mount('riot-tmp'
b970: 29 5b 30 5d 0a 20 20 20 20 65 78 70 65 63 74 28  )[0].    expect(
b980: 74 61 67 2e 72 65 66 73 2e 70 2e 69 6e 6e 65 72  tag.refs.p.inner
b990: 48 54 4d 4c 29 2e 74 6f 2e 62 65 2e 65 71 75 61  HTML).to.be.equa
b9a0: 6c 28 27 67 6f 6f 64 62 79 65 27 29 0a 20 20 20  l('goodbye').   
b9b0: 20 74 61 67 2e 75 6e 6d 6f 75 6e 74 28 29 0a 20   tag.unmount(). 
b9c0: 20 7d 29 0a 0a 20 20 69 74 28 27 61 76 6f 69 64   })..  it('avoid
b9d0: 20 74 6f 20 67 65 74 20 72 65 66 20 61 74 74 72   to get ref attr
b9e0: 69 62 75 74 65 73 20 6f 6e 20 79 69 65 6c 64 20  ibutes on yield 
b9f0: 74 61 67 73 27 2c 20 66 75 6e 63 74 69 6f 6e 28  tags', function(
ba00: 29 20 7b 0a 20 20 20 20 69 6e 6a 65 63 74 48 54  ) {.    injectHT
ba10: 4d 4c 28 27 3c 72 69 6f 74 2d 74 6d 70 3e 3c 2f  ML('<riot-tmp></
ba20: 72 69 6f 74 2d 74 6d 70 3e 27 29 0a 0a 20 20 20  riot-tmp>')..   
ba30: 20 72 69 6f 74 2e 74 61 67 28 27 72 69 6f 74 2d   riot.tag('riot-
ba40: 74 6d 70 27 2c 20 27 3c 79 69 65 6c 64 20 72 65  tmp', '<yield re
ba50: 66 3d 22 66 6f 6f 22 2f 3e 27 29 0a 0a 20 20 20  f="foo"/>')..   
ba60: 20 76 61 72 20 74 61 67 20 3d 20 72 69 6f 74 2e   var tag = riot.
ba70: 6d 6f 75 6e 74 28 27 72 69 6f 74 2d 74 6d 70 27  mount('riot-tmp'
ba80: 29 5b 30 5d 0a 20 20 20 20 65 78 70 65 63 74 28  )[0].    expect(
ba90: 74 61 67 2e 72 65 66 73 2e 66 6f 6f 29 2e 74 6f  tag.refs.foo).to
baa0: 2e 62 65 2e 75 6e 64 65 66 69 6e 65 64 0a 20 20  .be.undefined.  
bab0: 20 20 74 61 67 2e 75 6e 6d 6f 75 6e 74 28 29 0a    tag.unmount().
bac0: 20 20 7d 29 0a 0a 20 20 69 74 28 27 72 65 6d 6f    })..  it('remo
bad0: 76 65 20 73 74 79 6c 65 20 61 74 74 72 69 62 75  ve style attribu
bae0: 74 65 73 20 69 66 20 74 68 65 79 20 63 6f 6e 74  tes if they cont
baf0: 61 69 6e 20 62 6c 61 6e 6b 20 76 61 6c 75 65 73  ain blank values
bb00: 27 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a  ', function() {.
bb10: 20 20 20 20 69 6e 6a 65 63 74 48 54 4d 4c 28 27      injectHTML('
bb20: 3c 72 69 6f 74 2d 74 6d 70 3e 3c 2f 72 69 6f 74  <riot-tmp></riot
bb30: 2d 74 6d 70 3e 27 29 0a 0a 20 20 20 20 72 69 6f  -tmp>')..    rio
bb40: 74 2e 74 61 67 28 27 72 69 6f 74 2d 74 6d 70 27  t.tag('riot-tmp'
bb50: 2c 20 22 3c 70 20 72 65 66 3d 27 70 27 20 72 69  , "<p ref='p' ri
bb60: 6f 74 2d 73 74 79 6c 65 3d 5c 22 7b 63 68 61 6e  ot-style=\"{chan
bb70: 67 65 64 20 3f 20 27 62 61 63 6b 67 72 6f 75 6e  ged ? 'backgroun
bb80: 64 2d 63 6f 6c 6f 72 3a 20 67 72 65 65 6e 27 20  d-color: green' 
bb90: 3a 20 27 27 7d 5c 22 3e 3c 2f 70 3e 22 2c 20 66  : ''}\"></p>", f
bba0: 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20  unction() {.    
bbb0: 20 20 74 68 69 73 2e 63 68 61 6e 67 65 64 20 3d    this.changed =
bbc0: 20 74 72 75 65 0a 20 20 20 20 7d 29 0a 0a 20 20   true.    })..  
bbd0: 20 20 76 61 72 20 74 61 67 20 3d 20 72 69 6f 74    var tag = riot
bbe0: 2e 6d 6f 75 6e 74 28 27 72 69 6f 74 2d 74 6d 70  .mount('riot-tmp
bbf0: 27 29 5b 30 5d 0a 20 20 20 20 65 78 70 65 63 74  ')[0].    expect
bc00: 28 74 61 67 2e 72 65 66 73 2e 70 2e 68 61 73 41  (tag.refs.p.hasA
bc10: 74 74 72 69 62 75 74 65 28 27 73 74 79 6c 65 27  ttribute('style'
bc20: 29 29 2e 74 6f 2e 62 65 2e 6f 6b 0a 20 20 20 20  )).to.be.ok.    
bc30: 74 61 67 2e 63 68 61 6e 67 65 64 20 3d 20 66 61  tag.changed = fa
bc40: 6c 73 65 0a 20 20 20 20 74 61 67 2e 75 70 64 61  lse.    tag.upda
bc50: 74 65 28 29 0a 20 20 20 20 65 78 70 65 63 74 28  te().    expect(
bc60: 74 61 67 2e 72 65 66 73 2e 70 2e 68 61 73 41 74  tag.refs.p.hasAt
bc70: 74 72 69 62 75 74 65 28 27 73 74 79 6c 65 27 29  tribute('style')
bc80: 29 2e 74 6f 2e 62 65 2e 6e 6f 74 2e 6f 6b 0a 0a  ).to.be.not.ok..
bc90: 20 20 20 20 74 61 67 2e 75 6e 6d 6f 75 6e 74 28      tag.unmount(
bca0: 29 0a 20 20 7d 29 0a 0a 20 20 69 74 28 27 61 76  ).  })..  it('av
bcb0: 6f 69 64 20 74 6f 20 63 6c 65 61 6e 20 74 68 65  oid to clean the
bcc0: 20 44 4f 4d 20 66 6f 72 20 74 68 65 20 64 65 66   DOM for the def
bcd0: 61 75 6c 74 20 72 69 6f 74 2e 75 6e 6d 6f 75 6e  ault riot.unmoun
bce0: 74 20 63 61 6c 6c 27 2c 20 66 75 6e 63 74 69 6f  t call', functio
bcf0: 6e 28 64 6f 6e 65 29 20 7b 0a 20 20 20 20 69 6e  n(done) {.    in
bd00: 6a 65 63 74 48 54 4d 4c 28 27 3c 72 69 6f 74 2d  jectHTML('<riot-
bd10: 74 6d 70 3e 3c 2f 72 69 6f 74 2d 74 6d 70 3e 27  tmp></riot-tmp>'
bd20: 29 0a 0a 20 20 20 20 72 69 6f 74 2e 74 61 67 28  )..    riot.tag(
bd30: 27 72 69 6f 74 2d 74 6d 70 2d 73 75 62 27 2c 20  'riot-tmp-sub', 
bd40: 27 3c 70 20 69 64 3d 22 7b 20 69 64 20 7d 22 3e  '<p id="{ id }">
bd50: 66 6f 6f 3c 2f 70 3e 27 2c 20 66 75 6e 63 74 69  foo</p>', functi
bd60: 6f 6e 28 29 20 7b 0a 20 20 20 20 20 20 74 68 69  on() {.      thi
bd70: 73 2e 69 64 20 3d 20 60 69 64 2d 24 7b 20 74 68  s.id = `id-${ th
bd80: 69 73 2e 5f 72 69 6f 74 5f 69 64 20 7d 60 0a 0a  is._riot_id }`..
bd90: 20 20 20 20 20 20 74 68 69 73 2e 6f 6e 28 27 62        this.on('b
bda0: 65 66 6f 72 65 2d 75 6e 6d 6f 75 6e 74 27 2c 20  efore-unmount', 
bdb0: 28 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20  () => {.        
bdc0: 65 78 70 65 63 74 28 64 6f 63 75 6d 65 6e 74 2e  expect(document.
bdd0: 67 65 74 45 6c 65 6d 65 6e 74 42 79 49 64 28 74  getElementById(t
bde0: 68 69 73 2e 69 64 29 29 2e 74 6f 2e 62 65 2e 6f  his.id)).to.be.o
bdf0: 6b 0a 20 20 20 20 20 20 20 20 64 6f 6e 65 28 29  k.        done()
be00: 0a 20 20 20 20 20 20 7d 29 0a 20 20 20 20 7d 29  .      }).    })
be10: 0a 0a 20 20 20 20 72 69 6f 74 2e 74 61 67 28 27  ..    riot.tag('
be20: 72 69 6f 74 2d 74 6d 70 27 2c 20 27 3c 72 69 6f  riot-tmp', '<rio
be30: 74 2d 74 6d 70 2d 73 75 62 3e 3c 2f 72 69 6f 74  t-tmp-sub></riot
be40: 2d 74 6d 70 2d 73 75 62 3e 27 29 0a 0a 20 20 20  -tmp-sub>')..   
be50: 20 76 61 72 20 74 61 67 20 3d 20 72 69 6f 74 2e   var tag = riot.
be60: 6d 6f 75 6e 74 28 27 72 69 6f 74 2d 74 6d 70 27  mount('riot-tmp'
be70: 29 5b 30 5d 0a 0a 20 20 20 20 73 65 74 54 69 6d  )[0]..    setTim
be80: 65 6f 75 74 28 28 29 20 3d 3e 20 7b 0a 20 20 20  eout(() => {.   
be90: 20 20 20 65 78 70 65 63 74 28 64 6f 63 75 6d 65     expect(docume
bea0: 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42 79 49  nt.getElementByI
beb0: 64 28 74 61 67 2e 74 61 67 73 5b 27 72 69 6f 74  d(tag.tags['riot
bec0: 2d 74 6d 70 2d 73 75 62 27 5d 2e 69 64 29 29 2e  -tmp-sub'].id)).
bed0: 74 6f 2e 62 65 2e 6f 6b 0a 20 20 20 20 20 20 74  to.be.ok.      t
bee0: 61 67 2e 75 6e 6d 6f 75 6e 74 28 29 0a 20 20 20  ag.unmount().   
bef0: 20 7d 2c 20 31 30 30 29 0a 20 20 7d 29 0a 0a 20   }, 100).  }).. 
bf00: 20 69 74 28 27 61 76 6f 69 64 20 74 6f 20 62 69   it('avoid to bi
bf10: 6e 64 20 77 72 6f 6e 67 20 6e 61 6d 65 64 20 65  nd wrong named e
bf20: 76 65 6e 74 73 20 68 61 6e 64 6c 65 72 73 20 28  vents handlers (
bf30: 69 73 73 75 65 20 23 32 35 39 32 29 27 2c 20 66  issue #2592)', f
bf40: 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20  unction() {.    
bf50: 63 6f 6e 73 74 20 63 6c 69 63 6b 20 3d 20 73 69  const click = si
bf60: 6e 6f 6e 2e 73 70 79 28 29 0a 0a 20 20 20 20 69  non.spy()..    i
bf70: 6e 6a 65 63 74 48 54 4d 4c 28 27 3c 72 69 6f 74  njectHTML('<riot
bf80: 2d 74 6d 70 3e 3c 2f 72 69 6f 74 2d 74 6d 70 3e  -tmp></riot-tmp>
bf90: 27 29 0a 0a 20 20 20 20 72 69 6f 74 2e 74 61 67  ')..    riot.tag
bfa0: 28 27 72 69 6f 74 2d 74 6d 70 27 2c 20 27 3c 70  ('riot-tmp', '<p
bfb0: 20 72 65 66 3d 22 70 22 20 63 6c 69 63 6b 3d 22   ref="p" click="
bfc0: 7b 6f 6e 43 6c 69 63 6b 7d 22 3e 3c 2f 70 3e 27  {onClick}"></p>'
bfd0: 2c 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20 20  ,function() {.  
bfe0: 20 20 20 20 74 68 69 73 2e 6f 6e 43 6c 69 63 6b      this.onClick
bff0: 20 3d 20 63 6c 69 63 6b 0a 20 20 20 20 7d 29 0a   = click.    }).
c000: 0a 20 20 20 20 63 6f 6e 73 74 20 74 61 67 20 3d  .    const tag =
c010: 20 72 69 6f 74 2e 6d 6f 75 6e 74 28 27 72 69 6f   riot.mount('rio
c020: 74 2d 74 6d 70 27 29 5b 30 5d 0a 20 20 20 20 63  t-tmp')[0].    c
c030: 6f 6e 73 74 20 70 20 3d 20 74 61 67 2e 72 65 66  onst p = tag.ref
c040: 73 2e 70 0a 0a 20 20 20 20 66 69 72 65 45 76 65  s.p..    fireEve
c050: 6e 74 28 70 2c 20 27 63 6c 69 63 6b 27 29 0a 0a  nt(p, 'click')..
c060: 20 20 20 20 65 78 70 65 63 74 28 63 6c 69 63 6b      expect(click
c070: 29 2e 74 6f 2e 68 61 76 65 2e 6e 6f 74 2e 62 65  ).to.have.not.be
c080: 65 6e 2e 63 61 6c 6c 65 64 0a 0a 20 20 20 20 74  en.called..    t
c090: 61 67 2e 75 6e 6d 6f 75 6e 74 28 29 0a 20 20 7d  ag.unmount().  }
c0a0: 29 0a 0a 20 20 69 74 28 27 64 6f 65 73 20 6e 6f  )..  it('does no
c0b0: 74 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b  t attempt to mak
c0c0: 65 52 65 70 6c 61 63 65 56 69 72 74 75 61 6c 20  eReplaceVirtual 
c0d0: 77 68 65 6e 20 70 61 72 65 6e 74 4e 6f 64 65 20  when parentNode 
c0e0: 6e 6f 20 6c 6f 6e 67 65 72 20 65 78 69 73 74 73  no longer exists
c0f0: 20 69 6e 20 44 4f 4d 20 28 69 73 73 75 65 20 32   in DOM (issue 2
c100: 36 31 34 29 27 2c 20 66 75 6e 63 74 69 6f 6e 20  614)', function 
c110: 28 29 20 7b 0a 20 20 20 20 72 69 6f 74 2e 74 61  () {.    riot.ta
c120: 67 28 27 72 69 6f 74 2d 75 6e 6d 6f 75 6e 74 61  g('riot-unmounta
c130: 62 6c 65 27 2c 20 27 3c 76 69 72 74 75 61 6c 20  ble', '<virtual 
c140: 72 65 66 3d 22 76 69 72 74 75 61 6c 22 3e 48 69  ref="virtual">Hi
c150: 3c 2f 76 69 72 74 75 61 6c 3e 27 29 0a 20 20 20  </virtual>').   
c160: 20 69 6e 6a 65 63 74 48 54 4d 4c 28 27 3c 72 69   injectHTML('<ri
c170: 6f 74 2d 75 6e 6d 6f 75 6e 74 61 62 6c 65 3e 3c  ot-unmountable><
c180: 2f 72 69 6f 74 2d 75 6e 6d 6f 75 6e 74 61 62 6c  /riot-unmountabl
c190: 65 3e 27 29 0a 20 20 20 20 63 6f 6e 73 74 20 74  e>').    const t
c1a0: 61 67 20 3d 20 72 69 6f 74 2e 6d 6f 75 6e 74 28  ag = riot.mount(
c1b0: 27 72 69 6f 74 2d 75 6e 6d 6f 75 6e 74 61 62 6c  'riot-unmountabl
c1c0: 65 27 29 5b 30 5d 0a 20 20 20 20 63 6f 6e 73 74  e')[0].    const
c1d0: 20 76 69 72 74 20 3d 20 74 61 67 2e 72 65 66 73   virt = tag.refs
c1e0: 2e 76 69 72 74 75 61 6c 0a 0a 20 20 20 20 2f 2f  .virtual..    //
c1f0: 20 75 6e 6d 6f 75 6e 74 20 74 68 65 20 74 61 67   unmount the tag
c200: 3b 20 76 69 72 74 2e 72 6f 6f 74 2e 70 61 72 65  ; virt.root.pare
c210: 6e 74 4e 6f 64 65 20 77 69 6c 6c 20 6e 6f 77 20  ntNode will now 
c220: 62 65 20 6e 75 6c 6c 0a 20 20 20 20 74 61 67 2e  be null.    tag.
c230: 75 6e 6d 6f 75 6e 74 28 29 0a 20 20 20 20 72 69  unmount().    ri
c240: 6f 74 2e 75 74 69 6c 2e 74 61 67 73 2e 6d 61 6b  ot.util.tags.mak
c250: 65 52 65 70 6c 61 63 65 56 69 72 74 75 61 6c 28  eReplaceVirtual(
c260: 76 69 72 74 2c 20 76 69 72 74 2e 72 6f 6f 74 29  virt, virt.root)
c270: 0a 0a 20 20 20 20 2f 2f 20 67 65 74 74 69 6e 67  ..    // getting
c280: 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 70   to this point p
c290: 72 6f 76 65 73 20 6d 61 6b 65 52 65 70 6c 61 63  roves makeReplac
c2a0: 65 56 69 72 74 75 61 6c 20 72 65 74 75 72 6e 65  eVirtual returne
c2b0: 64 20 65 61 72 6c 79 20 28 69 2e 65 2e 2c 20 64  d early (i.e., d
c2c0: 69 64 20 6e 6f 74 20 65 72 72 6f 72 29 0a 20 20  id not error).  
c2d0: 20 20 65 78 70 65 63 74 28 74 72 75 65 29 2e 74    expect(true).t
c2e0: 6f 2e 62 65 2e 74 72 75 65 0a 20 20 7d 29 0a 0a  o.be.true.  })..
c2f0: 20 20 69 74 28 27 6d 61 6b 65 20 73 75 72 65 20    it('make sure 
c300: 6f 70 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20  options will be 
c310: 6e 6f 74 20 73 68 61 72 65 64 20 62 65 74 77 65  not shared betwe
c320: 65 6e 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 76 69  en components vi
c330: 61 20 72 69 6f 74 2e 6d 6f 75 6e 74 20 28 69 73  a riot.mount (is
c340: 73 75 65 20 32 36 31 33 29 27 2c 20 66 75 6e 63  sue 2613)', func
c350: 74 69 6f 6e 20 28 29 20 7b 0a 20 20 20 20 69 6e  tion () {.    in
c360: 6a 65 63 74 48 54 4d 4c 28 27 3c 72 69 6f 74 2d  jectHTML('<riot-
c370: 74 6d 70 20 74 69 74 6c 65 3d 22 42 61 72 22 3e  tmp title="Bar">
c380: 3c 2f 72 69 6f 74 2d 74 6d 70 3e 27 29 0a 20 20  </riot-tmp>').  
c390: 20 20 69 6e 6a 65 63 74 48 54 4d 4c 28 27 3c 72    injectHTML('<r
c3a0: 69 6f 74 2d 74 6d 70 3e 3c 2f 72 69 6f 74 2d 74  iot-tmp></riot-t
c3b0: 6d 70 3e 27 29 0a 20 20 20 20 72 69 6f 74 2e 74  mp>').    riot.t
c3c0: 61 67 28 27 72 69 6f 74 2d 74 6d 70 27 2c 20 27  ag('riot-tmp', '
c3d0: 7b 6f 70 74 73 2e 74 69 74 6c 65 7d 27 29 0a 0a  {opts.title}')..
c3e0: 20 20 20 20 63 6f 6e 73 74 20 74 61 67 73 20 3d      const tags =
c3f0: 20 72 69 6f 74 2e 6d 6f 75 6e 74 28 27 72 69 6f   riot.mount('rio
c400: 74 2d 74 6d 70 27 2c 20 66 75 6e 63 74 69 6f 6e  t-tmp', function
c410: 28 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  () {.      retur
c420: 6e 20 7b 20 74 69 74 6c 65 3a 20 27 42 61 7a 27  n { title: 'Baz'
c430: 20 7d 0a 20 20 20 20 7d 29 0a 0a 20 20 20 20 65   }.    })..    e
c440: 78 70 65 63 74 28 74 61 67 73 5b 30 5d 2e 6f 70  xpect(tags[0].op
c450: 74 73 2e 74 69 74 6c 65 29 2e 74 6f 2e 62 65 2e  ts.title).to.be.
c460: 65 71 75 61 6c 28 27 42 61 72 27 29 0a 20 20 20  equal('Bar').   
c470: 20 65 78 70 65 63 74 28 74 61 67 73 5b 31 5d 2e   expect(tags[1].
c480: 6f 70 74 73 2e 74 69 74 6c 65 29 2e 74 6f 2e 62  opts.title).to.b
c490: 65 2e 65 71 75 61 6c 28 27 42 61 7a 27 29 0a 0a  e.equal('Baz')..
c4a0: 20 20 20 20 74 61 67 73 2e 66 6f 72 45 61 63 68      tags.forEach
c4b0: 28 74 61 67 20 3d 3e 20 74 61 67 2e 75 6e 6d 6f  (tag => tag.unmo
c4c0: 75 6e 74 28 29 29 0a 20 20 7d 29 0a 0a 20 20 69  unt()).  })..  i
c4d0: 74 28 27 44 6f 6e 5c 27 74 20 72 65 6d 6f 76 65  t('Don\'t remove
c4e0: 20 76 61 6c 75 65 20 61 74 74 72 69 62 75 74 65   value attribute
c4f0: 73 20 77 69 74 68 20 74 68 65 20 73 65 74 74 69  s with the setti
c500: 6e 67 73 20 6b 65 65 70 56 61 6c 75 65 41 74 74  ngs keepValueAtt
c510: 72 69 62 75 74 65 73 3d 74 72 75 65 20 23 32 36  ributes=true #26
c520: 32 39 27 2c 20 66 75 6e 63 74 69 6f 6e 28 29 7b  29', function(){
c530: 0a 20 20 20 20 69 6e 6a 65 63 74 48 54 4d 4c 28  .    injectHTML(
c540: 27 3c 62 75 67 2d 32 36 32 39 3e 3c 2f 62 75 67  '<bug-2629></bug
c550: 2d 32 36 32 39 3e 27 29 0a 20 20 20 20 72 69 6f  -2629>').    rio
c560: 74 2e 73 65 74 74 69 6e 67 73 2e 6b 65 65 70 56  t.settings.keepV
c570: 61 6c 75 65 41 74 74 72 69 62 75 74 65 73 20 3d  alueAttributes =
c580: 20 74 72 75 65 0a 20 20 20 20 63 6f 6e 73 74 20   true.    const 
c590: 74 61 67 20 3d 20 72 69 6f 74 2e 6d 6f 75 6e 74  tag = riot.mount
c5a0: 28 27 62 75 67 2d 32 36 32 39 27 29 5b 30 5d 0a  ('bug-2629')[0].
c5b0: 0a 20 20 20 20 74 61 67 2e 75 70 64 61 74 65 28  .    tag.update(
c5c0: 29 0a 20 20 20 20 65 78 70 65 63 74 28 74 61 67  ).    expect(tag
c5d0: 2e 72 65 66 73 2e 6f 70 74 69 6f 6e 2e 63 68 69  .refs.option.chi
c5e0: 6c 64 4e 6f 64 65 73 5b 31 5d 2e 68 61 73 41 74  ldNodes[1].hasAt
c5f0: 74 72 69 62 75 74 65 28 27 76 61 6c 75 65 27 29  tribute('value')
c600: 29 2e 74 6f 2e 62 65 2e 6f 6b 0a 20 20 20 20 65  ).to.be.ok.    e
c610: 78 70 65 63 74 28 74 61 67 2e 72 65 66 73 2e 63  xpect(tag.refs.c
c620: 68 65 63 6b 5b 31 5d 2e 76 61 6c 75 65 29 2e 74  heck[1].value).t
c630: 6f 2e 62 65 2e 65 71 75 61 6c 28 27 27 29 0a 20  o.be.equal(''). 
c640: 20 20 20 65 78 70 65 63 74 28 74 61 67 2e 72 65     expect(tag.re
c650: 66 73 2e 72 61 64 69 6f 5b 31 5d 2e 76 61 6c 75  fs.radio[1].valu
c660: 65 29 2e 74 6f 2e 62 65 2e 65 71 75 61 6c 28 27  e).to.be.equal('
c670: 27 29 0a 20 20 20 20 74 61 67 2e 75 6e 6d 6f 75  ').    tag.unmou
c680: 6e 74 28 29 0a 20 20 20 20 72 69 6f 74 2e 73 65  nt().    riot.se
c690: 74 74 69 6e 67 73 2e 6b 65 65 70 56 61 6c 75 65  ttings.keepValue
c6a0: 41 74 74 72 69 62 75 74 65 73 20 3d 20 66 61 6c  Attributes = fal
c6b0: 73 65 0a 20 20 7d 29 0a 0a 20 20 69 74 28 27 52  se.  })..  it('R
c6c0: 65 6d 6f 76 65 20 65 6d 70 74 79 20 61 74 74 72  emove empty attr
c6d0: 69 62 75 74 65 73 20 77 69 74 68 20 74 68 65 20  ibutes with the 
c6e0: 73 65 74 74 69 6e 67 73 20 6b 65 65 70 56 61 6c  settings keepVal
c6f0: 75 65 41 74 74 72 69 62 75 74 65 73 3d 66 61 6c  ueAttributes=fal
c700: 73 65 20 23 32 36 32 39 27 2c 20 66 75 6e 63 74  se #2629', funct
c710: 69 6f 6e 28 29 7b 0a 20 20 20 20 69 6e 6a 65 63  ion(){.    injec
c720: 74 48 54 4d 4c 28 27 3c 62 75 67 2d 32 36 32 39  tHTML('<bug-2629
c730: 3e 3c 2f 62 75 67 2d 32 36 32 39 3e 27 29 0a 20  ></bug-2629>'). 
c740: 20 20 20 72 69 6f 74 2e 73 65 74 74 69 6e 67 73     riot.settings
c750: 2e 6b 65 65 70 56 61 6c 75 65 41 74 74 72 69 62  .keepValueAttrib
c760: 75 74 65 73 20 3d 20 66 61 6c 73 65 0a 0a 20 20  utes = false..  
c770: 20 20 63 6f 6e 73 74 20 74 61 67 20 3d 20 72 69    const tag = ri
c780: 6f 74 2e 6d 6f 75 6e 74 28 27 62 75 67 2d 32 36  ot.mount('bug-26
c790: 32 39 27 29 5b 30 5d 0a 0a 20 20 20 20 74 61 67  29')[0]..    tag
c7a0: 2e 75 70 64 61 74 65 28 29 0a 20 20 20 20 65 78  .update().    ex
c7b0: 70 65 63 74 28 74 61 67 2e 72 65 66 73 2e 6f 70  pect(tag.refs.op
c7c0: 74 69 6f 6e 2e 63 68 69 6c 64 4e 6f 64 65 73 5b  tion.childNodes[
c7d0: 31 5d 2e 68 61 73 41 74 74 72 69 62 75 74 65 28  1].hasAttribute(
c7e0: 27 76 61 6c 75 65 27 29 29 2e 74 6f 2e 62 65 2e  'value')).to.be.
c7f0: 6e 6f 74 2e 6f 6b 0a 20 20 20 20 65 78 70 65 63  not.ok.    expec
c800: 74 28 74 61 67 2e 72 65 66 73 2e 63 68 65 63 6b  t(tag.refs.check
c810: 5b 31 5d 2e 76 61 6c 75 65 29 2e 74 6f 2e 62 65  [1].value).to.be
c820: 2e 61 28 27 73 74 72 69 6e 67 27 29 0a 20 20 20  .a('string').   
c830: 20 65 78 70 65 63 74 28 74 61 67 2e 72 65 66 73   expect(tag.refs
c840: 2e 72 61 64 69 6f 5b 31 5d 2e 76 61 6c 75 65 29  .radio[1].value)
c850: 2e 74 6f 2e 62 65 2e 61 28 27 73 74 72 69 6e 67  .to.be.a('string
c860: 27 29 0a 20 20 20 20 74 61 67 2e 75 6e 6d 6f 75  ').    tag.unmou
c870: 6e 74 28 29 0a 20 20 7d 29 0a 7d 29 0a           nt().  }).}).