index.js 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. var cssauron = require('../index')
  2. , test = require('tape')
  3. , language
  4. language = cssauron({
  5. id: 'id'
  6. , class: 'class'
  7. , tag: 'tag'
  8. , attr: 'attr[attr]'
  9. , parent: 'parent'
  10. , children: 'children'
  11. , contents: 'contents || ""'
  12. }, function(type, pattern, data) {
  13. if (type == 'tag') {
  14. return pattern.toLowerCase() == data.toLowerCase();
  15. } else {
  16. return pattern == data;
  17. }
  18. })
  19. test('select single', test_select_single)
  20. test('select classlist', test_select_classlist)
  21. test('select multiple', test_select_multiple)
  22. test('select subject', test_select_subject)
  23. function test_select_single(assert) {
  24. var data = {id: 'one-id', class: 'one-class', tag: 'one-tag', attr:{first: 'test', second:'gary busey', third:'richard-m-nixon'}, parent:null, children:[]}
  25. assert.ok(language('#one-id')(data))
  26. assert.ok(!language('#one-id-false')(data))
  27. assert.ok(language('.one-class')(data))
  28. assert.ok(!language('.one-other-class')(data))
  29. assert.ok(language('one-tag')(data))
  30. assert.ok(!language('two-tag')(data))
  31. assert.ok(language('ONE-TAG')(data))
  32. assert.ok(!language('TWO-TAG')(data))
  33. assert.end()
  34. }
  35. function test_select_classlist(assert) {
  36. var data = [
  37. { class: 'a-class b-class c-class ' },
  38. { class: ['a-class', 'b-class', 'c-class'] }
  39. ]
  40. data.forEach(function(data) {
  41. assert.ok(language('.a-class')(data))
  42. assert.ok(language('.b-class')(data))
  43. assert.ok(language('.c-class')(data))
  44. assert.ok(!language('.one-other-class')(data))
  45. })
  46. assert.ok(!language('.whatever')({class: null}))
  47. assert.end()
  48. }
  49. function test_select_multiple(assert) {
  50. var data = {id: 'one-id', class: 'one-class', tag: 'one-tag', attr:{first: 'test', second:'gary busey', third:'richard-m-nixon'}, parent:null, children:[]}
  51. , data2 = {id: 'two-id', class: 'two-class', tag: 'two-tag', attr:{first: 'test', second:'gary busey', third:'richard-m-nixon'}, parent:null, children:[]}
  52. , data3 = {id: 'three-id', class: 'three-class', tag: 'three-tag', attr:{first: 'test', second:'gary busey', third:'richard-m-nixon'}, parent:null, children:[]}
  53. , parent = {id: 'parent-id', class: 'parent-class', tag: 'parent-tag', attr:{first: 'test', second:'gary busey', third:'richard-m-nixon'}, parent:null, children:[data, data2, data3]}
  54. , root = {id: 'root-id', class: 'root-class', tag: 'root-tag', attr:{first: 'test', second:'gary busey', third:'richard-m-nixon'}, parent:null, children:[parent]}
  55. data.parent = parent
  56. data2.parent = parent
  57. data3.parent = parent
  58. data2.contents = 'hello world'
  59. parent.parent = root
  60. assert.ok(language('#root-id #one-id')(data))
  61. assert.ok(language('#nope,#root-id #one-id')(data))
  62. assert.ok(!language('#nope, #nada')(data))
  63. assert.ok(!language('#root-id > #one-id')(data))
  64. assert.ok(language('#root-id > #parent-id > #one-id')(data))
  65. assert.ok(
  66. language('#parent-id > #one-id,\n#root-id > #parent-id > #one-id')(data)
  67. )
  68. assert.ok(
  69. language(
  70. '#ok,\n #parent-id > #one-id,\n#root-id > #parent-id > #one-id'
  71. )(data)
  72. )
  73. assert.ok(language('.one-class + .two-class')(data2))
  74. assert.ok(!language('.one-class + #one-id')(data))
  75. assert.ok(language('one-tag ~ #three-id')(data3))
  76. assert.ok(language('ONE-TAG ~ #three-id')(data3))
  77. assert.ok(language('one-tag:first-child')(data))
  78. assert.ok(language('one-tag:empty')(data))
  79. assert.ok(!language('#parent-id:empty')(parent))
  80. assert.ok(!language('one-tag:last-child')(data))
  81. assert.ok(language('three-tag:last-child')(data3))
  82. assert.ok(language('one-tag:nth-child(1)')(data))
  83. assert.ok(language('two-tag:nth-child(2)')(data2))
  84. assert.ok(language('three-tag:nth-child(3)')(data3))
  85. assert.ok(!language('three-tag:nth-child(1)')(data))
  86. assert.ok(language('one-tag:nth-child(odd)')(data))
  87. assert.ok(!language('two-tag:nth-child(odd)')(data2))
  88. assert.ok(language('three-tag:nth-child(odd)')(data3))
  89. assert.ok(!language('one-tag:nth-child(even)')(data))
  90. assert.ok(language('two-tag:nth-child(even)')(data2))
  91. assert.ok(!language('three-tag:nth-child(even)')(data3))
  92. assert.ok(language('one-tag:nth-child(2n+1)')(data))
  93. assert.ok(!language('one-tag:nth-child(2n+0)')(data))
  94. assert.ok(language('two-tag:nth-child(2n+0)')(data2))
  95. assert.ok(language('one-tag:nth-child(0n+1)')(data))
  96. assert.ok(language('three-tag:nth-child(0n+3)')(data3))
  97. assert.ok(language('three-tag:nth-child(4n-1)')(data3))
  98. assert.ok(language('two-tag:nth-child( 3n - 1 )')(data2))
  99. assert.ok(language('one-tag:nth-child( +3n - 2 )')(data))
  100. assert.ok(language('three-tag:nth-child( +3 )')(data3))
  101. assert.ok(language('one-tag:nth-child( -n + 2 )')(data))
  102. assert.ok(language('two-tag:nth-child( -n + 2 )')(data2))
  103. assert.ok(!language('three-tag:nth-child( -n + 2 )')(data3))
  104. assert.ok(language('one-tag:nth-child( -n + 1 )')(data))
  105. assert.ok(!language('two-tag:nth-child( -n + 1 )')(data2))
  106. assert.ok(language('[first]')(data))
  107. assert.ok(!language('[dne]')(data))
  108. assert.ok(language('[first=test]')(data))
  109. assert.ok(language('[first="test"]')(data))
  110. assert.ok(language('[second="gary busey"]')(data))
  111. assert.ok(language('[second="gary busey"] [second="gary busey"]')(data))
  112. assert.ok(language('[third|=m]')(data))
  113. assert.ok(language('[third|=richard]')(data))
  114. assert.ok(language('[third|=nixon]')(data))
  115. assert.ok(!language('[third|=tricky-dick]')(data))
  116. assert.ok(language('[third$=nixon]')(data))
  117. assert.ok(!language('[third$=dixon]')(data))
  118. assert.ok(!language('[third^=dick]')(data))
  119. assert.ok(language('[third^=richard]')(data))
  120. assert.ok(language('[third*=-m-]')(data))
  121. assert.ok(!language('[third*=radical]')(data))
  122. assert.ok(!language('[second~=dne]')(data))
  123. assert.ok(language('[second~=gary]')(data))
  124. assert.ok(language('[second~=busey]')(data))
  125. assert.ok(!language(':contains(hello)')(data))
  126. assert.ok(!language(':contains(world)')(data))
  127. assert.ok(language(':contains(hello)')(data2))
  128. assert.ok(language(':contains(world)')(data2))
  129. assert.ok(
  130. language(':root > :any(thing-tag, parent-tag, #asdf) > #one-id')(data)
  131. )
  132. assert.end()
  133. }
  134. function test_select_subject(assert) {
  135. var data = {id: 'one-id', class: 'one-class', tag: 'one-tag', attr:{first: 'test', second:'gary busey', third:'richard-m-nixon'}, parent:null, children:[]}
  136. , data2 = {id: 'two-id', class: 'two-class', tag: 'two-tag', attr:{first: 'test', second:'gary busey', third:'richard-m-nixon'}, parent:null, children:[]}
  137. , data3 = {id: 'three-id', class: 'three-class', tag: 'three-tag', attr:{first: 'test', second:'gary busey', third:'richard-m-nixon'}, parent:null, children:[]}
  138. , parent = {id: 'parent-id', class: 'parent-class', tag: 'parent-tag', attr:{first: 'test', second:'gary busey', third:'richard-m-nixon'}, parent:null, children:[data, data2, data3]}
  139. , root = {id: 'root-id', class: 'root-class', tag: 'root-tag', attr:{first: 'test', second:'gary busey', third:'richard-m-nixon'}, parent:null, children:[parent]}
  140. , res
  141. data.parent = parent
  142. data2.parent = parent
  143. data3.parent = parent
  144. data2.contents = 'hello world'
  145. parent.parent = root
  146. assert.equal(
  147. language(':root > :any(thing-tag, parent-tag, #asdf) > #one-id')(data)
  148. , data
  149. )
  150. assert.equal(
  151. language(':root > !parent-tag > #one-id')(data)
  152. , parent
  153. )
  154. res = language(
  155. ':root > !:any(thing-tag, parent-tag, #asdf) > !#one-id'
  156. )(data)
  157. assert.equal(
  158. res[0]
  159. , data
  160. )
  161. assert.equal(
  162. res[1]
  163. , parent
  164. )
  165. // one of these has a subject, one doesn't
  166. res = language(
  167. ':root > parent-tag > #one-id, !#root-id *'
  168. )(data)
  169. assert.equal(
  170. res[0]
  171. , root
  172. )
  173. assert.equal(
  174. res[1]
  175. , data
  176. )
  177. // no duplicates, no matter how many valid selections.
  178. // both sides select `data`.
  179. res = language(
  180. ':root > parent-tag > #one-id, #root-id !*'
  181. )(data)
  182. assert.equal(res, data)
  183. assert.end()
  184. }